C# 一个事务下.Net中的多个存储过程调用

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网页,其中调用了两个存储过程。 这两个过程都在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
vs
SqlTransaction
,您听起来有点犹豫不决
TransactionScope
更通用,因为它可以跨单相和分布式事务(使用
DTC
)。但是,如果您只需要在同一数据库的单个连接上协调事务,则
SqlTransaction
也可以。

因此.net事务将是外部事务,只需要在网页代码中管理它,对吗?不需要跟踪@事务计数?如果我的问题很傻,很抱歉,但我仍然无法完全理解c#事务。是的,您不必担心@TRANCOUNT-这只是SqlServer内部跟踪BEGIN TRANs数量的方式(无论是由进程直接调用,还是通过SqlTransaction或TransactionScope间接调用)。因此,本质上,C#事务的工作方式与SQL事务相同?