我有一个执行事务的存储过程,代码是很久以前编写的,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还是使用封装事务的SP更好。
发布于 2016-03-31 03:11:14
使用T-SQL意味着您还在执行其他语句。这意味着您可以节省服务器往返时间。BeginTransaction执行一次往返。
如果您没有运行其他T-SQL,那么两个版本都会执行相同数量的往返。
往返是主要的费用。事务管理非常便宜。
这是一个已知的反模式:
catch(Exception)
{
dbTransaction.Rollback();
}什么都不做。事务将在Dispose上回滚。这是多余的,并且吞噬了异常,这是一个非常糟糕的结果。
还要注意,您不必使用procs来执行T-SQL。
除非您认为这两个额外的往返是性能问题,否则您应该使用更简单、更可靠的C#事务管理。T-SQL在错误处理方面非常糟糕。
发布于 2016-03-31 02:40:31
从性能的角度来看,最好将存储过程与事务一起使用,因为SQL Server可以对其进行更多的优化。从最终用户的角度来看,这并不重要,除非您在非常大的表上进行操作。从开发人员的角度来看,使用EF要简单得多,这真的很重要。
https://stackoverflow.com/questions/36312605
复制相似问题