我有一个执行事务的存储过程,代码是很久以前写的,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更好。
答案 0 :(得分:0)
使用T-SQL意味着您也在执行其他语句。这意味着您可以保存服务器往返。 BeginTransaction
执行往返。
如果您没有其他T-SQL运行,则两个版本都执行相同数量的往返。
往返是主要成本。交易管理非常便宜。
这是一种已知的反模式:
catch(Exception)
{
dbTransaction.Rollback();
}
什么都不做。该事务将在Dispose
上回滚。这是多余的,并吞下了一个非常糟糕的结果。
另请注意,您不必使用procs来执行T-SQL。
除非您认为这两个额外的往返是性能问题,否则您应该使用更简单,更可靠的C#事务管理。错误处理时,T-SQL 可怕。
答案 1 :(得分:-1)
从性能的角度来看,最好将存储过程与事务一起使用,因为SQL Server可以对其进行更优化。从最终用户的角度来看,除非你在非常大的桌子上操作,否则它并不重要。从开发人员的角度来看,使用EF更加简单,这一点非常重要。