C# 调用存储过程时的.NET 4.0事务行为

C# 调用存储过程时的.NET 4.0事务行为,c#,sql-server,stored-procedures,transactions,C#,Sql Server,Stored Procedures,Transactions,如果我创建一个SqlConnection而不从C#code为其创建SqlTransaction,然后使用SqlCommand调用存储过程,那么在以下两种情况下代码的事务行为是什么 存储过程没有任何开始事务语句 存储过程在开始时有一个开始事务,在结束时有一个提交事务 假设没有发生会导致事务回滚的错误 据我所知,存储过程将在事务外部调用,并导致以下行为: 存储过程中的每个语句都将在其自己的事务中执行 存储过程中打开的事务将是顶级事务,存储过程中的所有语句都将与该事务关联 请评论我对A和B场景的理解是

如果我创建一个
SqlConnection
而不从C#code为其创建
SqlTransaction
,然后使用
SqlCommand
调用存储过程,那么在以下两种情况下代码的事务行为是什么

  • 存储过程没有任何
    开始事务
    语句
  • 存储过程在开始时有一个
    开始事务
    ,在结束时有一个
    提交事务
  • 假设没有发生会导致事务回滚的错误

    据我所知,存储过程将在事务外部调用,并导致以下行为:

  • 存储过程中的每个语句都将在其自己的事务中执行
  • 存储过程中打开的事务将是顶级事务,存储过程中的所有语句都将与该事务关联

  • 请评论我对A和B场景的理解是否正确。

    您对A和B场景的理解是否正确


    当涉及大量UI端数据交互时,人们更喜欢ADO.NET事务,并且更喜欢在UI端处理它。否则,您必须将所有数据传递到SQL端,让它处理,这有时会造成开销。

    事务嵌套的方式与预期不同。如果我没记错的话,每个begin trans递增一个计数器,commit递减它,当它达到0时,它将进行实提交。现在,当您混合使用TSQL和ADO.NET事务时,可能会得到意外的结果。通常,使用其中一种,但不能同时使用两种。参考:另一件事是僵尸交易