C# 一个事务下.Net中的多个存储过程调用
我有一个.net网页,其中调用了两个存储过程。 这两个过程都在sql server中有begin commit事务。此外,根据某些if条件,我会多次调用第二个过程 我想把整个过程包装在一个事务中。我环顾四周,发现C#中的Sqltransaction和TransactionScope类将在这种情况下帮助我 但我从未使用过它们,总是在sql server中使用事务,因此不知道.Net中的事务是否会有问题,因为我的两个存储过程在sql server中都有自己的Begin commit事务C# 一个事务下.Net中的多个存储过程调用,c#,asp.net,sql-server,transactions,transactionscope,C#,Asp.net,Sql Server,Transactions,Transactionscope,我有一个.net网页,其中调用了两个存储过程。 这两个过程都在sql server中有begin commit事务。此外,根据某些if条件,我会多次调用第二个过程 我想把整个过程包装在一个事务中。我环顾四周,发现C#中的Sqltransaction和TransactionScope类将在这种情况下帮助我 但我从未使用过它们,总是在sql server中使用事务,因此不知道.Net中的事务是否会有问题,因为我的两个存储过程在sql server中都有自己的Begin commit事务 如果它们发生
如果它们发生冲突,是否有办法让它们在单个事务下工作?是的,可以从.Net调用(例如现有或遗留)存储的进程,这些进程使用.Net
事务范围下的手动开始传输,提交传输/回滚,或者如果您从SqlTransaction
管理事务。(尽管这是显而易见的,但如果您可以避免使用多个事务技术,请这样做)
对于“快乐案例”场景,当调用SPROC
事务时,@@tracount
将增加(就像SqlServer中的嵌套事务一样)。只有在连接的最外层提交之后,@@TRANCOUNT
达到零时,事务才会提交。i、 e.内部提交
只会减少@@tracount
。但是请注意,对于回滚
,情况并非如此-除非您正在使用,否则任何回滚都将回滚整个事务。您需要非常小心地匹配@@TRANCOUNTs
对于TransactionScope
vsSqlTransaction
,您听起来有点犹豫不决TransactionScope
更通用,因为它可以跨单相和分布式事务(使用DTC
)。但是,如果您只需要在同一数据库的单个连接上协调事务,则SqlTransaction
也可以。因此.net事务将是外部事务,只需要在网页代码中管理它,对吗?不需要跟踪@事务计数?如果我的问题很傻,很抱歉,但我仍然无法完全理解c#事务。是的,您不必担心@TRANCOUNT-这只是SqlServer内部跟踪BEGIN TRANs数量的方式(无论是由进程直接调用,还是通过SqlTransaction或TransactionScope间接调用)。因此,本质上,C#事务的工作方式与SQL事务相同?