这些代码有何不同:
using (TransactionScope tran = new TransactionScope ())
{
using (Entities ent = new Entities())
{
和
using (Entities ent = new Entities())
{
using (TransactionScope tran = new TransactionScope ())
{
订单行是否重要?
由于
答案 0 :(得分:1)
在这种情况下没关系,因为Entities
看起来像Model / Data类,它不能/不需要登记到事务中,所以你可以有任何订单,它不会产生差异。现在,如果Entities
操作中存在任何问题,则读取/ DML然后事务也将中止,假设操作发生在环境事务上下文中,尽管像IDBConnection
这样的类/对象无论如何都会自动执行登入事务(未提供设置为false),但即使Connection在事务上下文外创建,也不会自动登记,需要显式登记事务上下文
简短
对于您当前的代码,在您处理需要像IDBConnection
之类的交易登记的对象之前,这一点无关紧要。 虽然我的偏好是第一个,但环境事务全部包含所有需要自动登记的对象,我们不会遗漏任何对象。
重要差异
您可能需要注意的是,您是否要访问交易上下文之外的实体,因为在选项1中这是不可能的,但在选项2中不是问题 < / p>
答案 1 :(得分:1)
是的,订单很重要。或者更确切地说,如果不查看代码,我们就不能说无关紧要。
如果环境事务处于Open()编辑状态,则DbConnection实例将存在于环境事务中。
您的DbContext构造函数可能会打开底层的DbConnection,在这种情况下,这两种模式会有所不同。
第一个是正常模式,你应该坚持下去。
此外,如果您使用的是SQL Server,请不要使用TransactionScope的默认构造函数。见Using new TransactionScope() Considered Harmful