在存储过程中处理的实体Framework6事务与事务

时间:2016-03-30 14:58:11

标签: sql-server entity-framework stored-procedures optimization transactions

我有一个执行事务的存储过程,代码是很久以前写的,SP看起来像这样:

begin transaction
    begin try
        ...
        commit transaction
    end try
    begin catch
        ...
        rollback transaction
    end catch

现在。我知道EF6允许您更智能地使用交易:

using (var db = myDbContext)
    using (var dbTransaction = db.DataBase.BeginTransaction)
    {
        try
        {
            //do stuff...
            dbTransaction.Commit();
        }
        catch(Exception)
        {
            dbTransaction.Rollback();
        }
    }

我更喜欢EF方法,但我想知道从性能角度来看,使用EF for Transactions还是封装事务的SP更好。

2 个答案:

答案 0 :(得分:0)

使用T-SQL意味着您也在执行其他语句。这意味着您可以保存服务器往返。 BeginTransaction执行往返。

如果您没有其他T-SQL运行,则两个版本都执行相同数量的往返。

往返是主要成本。交易管理非常便宜。

这是一种已知的反模式:

    catch(Exception)
    {
        dbTransaction.Rollback();
    }

什么都不做。该事务将在Dispose上回滚。这是多余的,并吞下了一个非常糟糕的结果。

另请注意,您不必使用procs来执行T-SQL。

除非您认为这两个额外的往返是性能问题,否则您应该使用更简单,更可靠的C#事务管理。错误处理时,T-SQL 可怕

答案 1 :(得分:-1)

从性能的角度来看,最好将存储过程与事务一起使用,因为SQL Server可以对其进行更优化。从最终用户的角度来看,除非你在非常大的桌子上操作,否则它并不重要。从开发人员的角度来看,使用EF更加简单,这一点非常重要。