Database.BeginTransaction vs Transactions.TransactionScope

时间:2014-03-13 15:09:39

标签: c# entity-framework transactions entity-framework-6 transactionscope

System.Transactions.TransactionScope和EF6&{39} Database.BeginTransaction之间的区别是什么?

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

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

2 个答案:

答案 0 :(得分:81)

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

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

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

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

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

可以找到更多信息here

答案 1 :(得分:5)

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

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 仅支持非分布式事务(所有操作都在单个数据库中完成的本地事务)。

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

TransactionScope 的优缺点:

TransactionScope 的缺点:

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

TransactionScope 的优势:

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

基于this MSDN article