当表中只有一个插入时,TransactionScope
会有什么不同吗?
时
MyObjectContext.Messages.Save( message, m => m.ID == message.ID);
MyObjectContext.SaveChanges();
与
不同using( var ts = new TransactionScope() )
{
MyObjectContext.Messages.Save( message, m => m.ID == message.ID);
MyObjectContext.SaveChanges();
ts.Complete();
}
究竟是怎么回事?
答案 0 :(得分:1)
不,没有区别。
SaveChanges
在交易中运作。如果无法保留任何脏SaveChanges
对象,ObjectStateEntry
将回滚该事务并抛出异常。
答案 1 :(得分:1)
如果您保存一个项目或多个项目无关紧要,TransactionScope
的使用在这里是多余的。
来自documentation for ObjectContext.SaveChanges
:
SaveChanges在一个 交易。 SaveChanges将滚动 回到那个交易并抛出一个 异常,如果有任何脏 ObjectStateEntry对象不能 持续存在。
所以你在你的例子中对TransactionScope
进行分层而没有额外的好处。
现在,如果您有两个单独的ObjectContext
个实例,并且您希望确保两个数据都已保存,那么您对TransactionScope
的两个调用都绝对需要ObjectContext.SaveChanges
}。
答案 2 :(得分:1)
有区别。如果仅使用SaveChanges
,则仍然有一个事务,但它具有数据库服务器的默认隔离级别 - 在SQL服务器的情况下,它是Read committed。如果您使用默认配置TransactionScope
,则您具有序列化事务隔离级别,但如果使用TransactionScope
的其他构造函数,则可以更改它。
如果您需要控制事务隔离级别,那么它会有所不同。