创建TransactionScope并创建上下文顺序

时间:2018-05-05 12:53:20

标签: c# entity-framework c#-4.0 entity transactionscope

这些代码有何不同:

using (TransactionScope tran = new TransactionScope ())
{
     using (Entities ent = new Entities())
     {

using (Entities ent = new Entities())
{
    using (TransactionScope tran = new TransactionScope ())
    {

订单行是否重要?

由于

2 个答案:

答案 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