Sql server 对于SqlServer,对单个语句使用TransactionScope是否会造成性能损失(或额外调用)?

Sql server 对于SqlServer,对单个语句使用TransactionScope是否会造成性能损失(或额外调用)?,sql-server,entity-framework,transactionscope,Sql Server,Entity Framework,Transactionscope,我有一个更新SqlServer的进程。有时该过程是一条语句(UPDATE…),有时是几个语句,每个语句都使用sp_executesql。在TransactionScope中包装一个或多个语句的标准化将大大简化我的代码,并防止我必须将每个流程标记为“withintransaction”或“withintransaction” 作为参考,封装事务的外观如下所示: using(var transactionScope = new TransactionScope()) {...one or m

我有一个更新SqlServer的进程。有时该过程是一条语句(UPDATE…),有时是几个语句,每个语句都使用
sp_executesql
。在TransactionScope中包装一个或多个语句的标准化将大大简化我的代码,并防止我必须将每个流程标记为“withintransaction”或“withintransaction”

作为参考,封装事务的外观如下所示:

    using(var transactionScope = new TransactionScope())
{...one or more sql statements... transactionScope.Complete();}
我已经对这些条目运行了SqlProfiler

未在TransactionScope中包装的SqlProfiler条目:

exec sp_executesql
执行sp_重置_连接
TransactionScope中包装的SqlProfiler条目:

exec sp_executesql TransactionID=12345
exec sp_重置_连接事务ID=12345
根据这些条目,我猜测调用transaction.Complete()不会引起额外的调用,而是在exec\u sp\u reset\u连接中完成事务

因此,我正在寻找以下问题的明确答案:

  • 使用TransactionScope()是否有针对单个sql语句的最佳实践
  • 调用transactionScope.Complete()是否会导致额外的db调用

非常感谢

我将第一个要点改为不是关于性能,而是关于最佳实践。在关系数据库上测试性能,要启动事务,有很多不同的环境(本地/暂存/服务器…磁性/ssd/内存…无并发/高读/高写),我希望有关于最佳实践的指导。我相信EF会将一切都打包在一个事务中。这是否意味着我们在处理sql时应该这样做?有一个堆栈问题可以解决第1点,但您可能会在数据库管理员上得到更好的响应。谢谢,我做了一个快速性能检查,在同一个更新查询上本地循环1000次,每次调用使用/不使用transactionscope。添加事务范围肯定会让事情慢下来20-30%。这对我来说意义重大,我可以将它放到我的存储库中,以嗅探它是一个操作还是多个操作。我将第一个项目改为不是专门针对性能,而是针对最佳实践。在关系数据库上测试性能,要启动事务,有很多不同的环境(本地/暂存/服务器…磁性/ssd/内存…无并发/高读/高写),我希望有关于最佳实践的指导。我相信EF会将一切都打包在一个事务中。这是否意味着我们在处理sql时应该这样做?有一个堆栈问题可以解决第1点,但您可能会在数据库管理员上得到更好的响应。谢谢,我做了一个快速性能检查,在同一个更新查询上本地循环1000次,每次调用使用/不使用transactionscope。添加事务范围肯定会让事情慢下来20-30%。这对我来说非常重要,我可以将它放到我的存储库中去嗅探它是一个操作还是多个操作。
exec sp_executesql <update statement>
exec sp_reset_connection
exec sp_executesql <update statement> TransactionID=12345
exec sp_reset_connection TransactionID=12345