C# Database.BeginTransaction vs Transactions.TransactionScope

C# Database.BeginTransaction vs Transactions.TransactionScope,c#,entity-framework,transactions,entity-framework-6,transactionscope,C#,Entity Framework,Transactions,Entity Framework 6,Transactionscope,System.Transactions.TransactionScope和EF6的数据库.BeginTransaction之间有什么区别 有人能举一个小例子,或者只是解释一下当有明显差异时应该使用哪一个 在我的项目中,我使用的是EF6。我已经阅读了文档,但没有多大帮助。还查找了示例,但它们使用的是SqlConnection.BeginTransaction,现在MS在EF6中引入了这个新的数据库。BeginTransaction。我在Entity Framework 6的文档中找到了答案: 随着

System.Transactions.TransactionScope
和EF6的
数据库.BeginTransaction
之间有什么区别

有人能举一个小例子,或者只是解释一下当有明显差异时应该使用哪一个


在我的项目中,我使用的是EF6。我已经阅读了文档,但没有多大帮助。还查找了示例,但它们使用的是
SqlConnection.BeginTransaction
,现在MS在EF6中引入了这个新的
数据库。BeginTransaction

我在Entity Framework 6的文档中找到了答案:

随着EF6的引入,Microsoft建议使用新的API方法:
Database.BeginTransaction()
Database.UseTransaction()
。虽然
System.Transactions.TransactionScope
仍然得到很好的支持,但对于大多数EF6用户来说,它不再是必需的

虽然
Database.BeginTransaction()
仅用于与数据库相关的操作事务,
System.Transactions.TransactionScope
,除此之外,“普通C#code”还可以是事务性的

因此,使用
Database.BeginTransaction()

对于那些仍然喜欢
TransactionScope
方法的人,建议他们检查其局限性,尤其是在云场景中(云场景不支持分布式事务)


更多信息请参见

公认的流行答案具有误导性。
Database.BeginTransaction()
System.Transactions.TransactionScope
都用于数据库操作

Database.BeginTransaction()和System.Transactions.TransactionScope之间的主要区别: 风格
  • 使用TransactionScope,您可以在后台隐式设置事务(通过使用scope=new TransactionScope
将所有事务操作包装为起始
和结束
scope.Complete();
以提交
  • 对于Database.BeginTransaction,通过写入
    sqlCommand.transaction=sqlTxn;
    context.Database.UseTransaction(sqlTxn);
  • 分布式事务
    • TransactionScope支持分布式事务(其中单个事务涉及多个DB)和非分布式事务
    • Database.BeginTransaction仅支持非分布式事务(所有操作都在单个数据库中完成的本地事务)
    MSDN声明,对于新的Database.BeginTransaction()和Database.UseTransaction()API,大多数用户不再需要TransactionScope方法

    TransactionScope的优缺点: TransactionScope的缺点:

    • 需要.NET 4.5.1或更高版本才能使用异步方法
    • 除非您确定自己只有一个连接(云场景不支持分布式事务),否则不能在云场景中使用它
    • 它不能与前面章节的Database.UseTransaction()方法结合使用
    • 如果您发出任何DDL并且没有通过MSDTC服务启用分布式事务,它将抛出异常
    TransactionScope的优势:

    • 如果您与给定数据库建立了多个连接,或者在同一事务中将与一个数据库的连接与与与另一个数据库的连接结合起来,它将自动将本地事务升级为分布式事务(注意:必须将MSDTC服务配置为允许分布式事务才能工作)
    • 易于编码。如果您希望事务处于环境中,并且在后台隐式处理,而不是在您的控制下显式处理,那么TransactionScope方法可能更适合您

    基于。

    不幸的是,你不能用Database.BeginTransaction嵌套事务,而你可以用TransactionScope嵌套事务。“普通C代码”也是事务性的“真正含义是什么?”@Gerard我认为这意味着如果你在EF之外执行SQL操作(比如使用ADO.NET),这些操作也将在同一事务下发生。@Rudey-这是不正确的,
    Database.BeginTransaction()也支持EF之外的SQL操作
    。有关Database.BeginTransaction和TransactionScope之间的实际差异,请参阅我的答案。这里有太多错误信息,不应该是公认的答案。