System.Transactions.TransactionScope
和EF6&{39} Database.BeginTransaction
之间的区别是什么?
有人可以给出一个小例子,或者只是解释哪一个有明显的区别?
P.S:在我的项目中,我使用的是EF6。我已经阅读了文档,但它没有多大帮助。还查看了示例,但他们正在使用SqlConnection.BeginTransaction
,现在MS在EF6中引入了这个新的Database.BeginTransaction
。
答案 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
都用于数据库操作。
using scope = new TransactionScope
和结束 scope.Complete();
包装所有事务操作来提交。sqlCommand.Transaction = sqlTxn;
和 context.Database.UseTransaction(sqlTxn);
MSDN 确实声明,使用新的 Database.BeginTransaction() 和 Database.UseTransaction() API,大多数用户不再需要 TransactionScope 方法。
TransactionScope 的缺点:
TransactionScope 的优势: