添加对象时TransactionContext有何不同?

时间:2011-05-30 19:15:51

标签: c# database entity-framework entity-framework-4 transactionscope

当表中只有一个插入时,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();
}

究竟是怎么回事?

3 个答案:

答案 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的其他构造函数,则可以更改它。

如果您需要控制事务隔离级别,那么它会有所不同。