Database.BeginTransaction vs Transactions.TransactionScope

Fla*_*air 77 c# entity-framework transactions transactionscope entity-framework-6

System.Transactions.TransactionScope和EF6有什么区别Database.BeginTransaction

有人可以给出一个小例子,或者只是解释哪一个有明显区别?

PS:在我的项目中,我使用的是EF6.我已经阅读了文档,但它没有多大帮助.还查看了这些示例,但它们正在使用SqlConnection.BeginTransaction,现在MS已经Database.BeginTransaction在EF6中引入了这个新功能.

Fla*_*air 87

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

随着EF6的推出,Microsoft建议使用新的API方法:Database.BeginTransaction()Database.UseTransaction().尽管System.Transactions.TransactionScope仍然得到很好的支持,但大多数EF6用户不再需要它.

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

因此,Database.BeginTransaction()在EF6中的事务中只使用db相关操作,否则System.Transactions.TransactionScope用于在事务中将db操作和C#代码混合在一起.

对于那些仍然喜欢这种TransactionScope方法的人,建议他们检查一下它的局限性,特别是在云场景中(云场景不支持分布式事务).

更多信息可以在这里找到

  • “纯 C# 代码”也是事务性的”真正意味着什么? (12认同)
  • 不幸的是,您无法使用Database.BeginTransaction嵌套事务,而您可以使用TransactionScope. (6认同)
  • 这里有很多层错误信息,不应该是公认的答案。 (2认同)

Bor*_*ode 10

公认的流行答案具有误导性。这两个Database.BeginTransaction()System.Transactions.TransactionScope是DB操作。

Database.BeginTransaction() 和 System.Transactions.TransactionScope 的主要区别:

风格

  • 使用 TransactionScope,您可以在后台隐式设置事务(通过用开始using scope = new TransactionScope和结束scope.Complete();来包装所有事务操作以进行提交。
  • 使用 Database.BeginTransaction 通过写入sqlCommand.Transaction = sqlTxn;和显式设置事务context.Database.UseTransaction(sqlTxn);

分布式事务

  • TransactionScope 支持分布式事务(在单个事务中涉及多个 DB)和非分布式事务。
  • Database.BeginTransaction 仅支持非分布式事务(所有操作都在单个 DB 中完成的本地事务)。

MSDN 确实声明,使用新的 Database.BeginTransaction() 和 Database.UseTransaction() API,大多数用户不再需要 TransactionScope 方法。

TransactionScope 的优缺点:

TransactionScope 的缺点:

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

TransactionScope 的优点:

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

基于这篇 MSDN 文章