Transactions 数据库事务如何影响MSSQL服务器的性能和吞吐量?

Transactions 数据库事务如何影响MSSQL服务器的性能和吞吐量?,transactions,database-performance,throughput,Transactions,Database Performance,Throughput,目前,每当有人调用web方法并在web方法返回后提交时,我们的服务器端平台就会启动一个DB事务。所有web服务都是事务性的,即使是那些不更新数据库的服务 这样的决定对性能有什么影响?如果我停止在不更新数据库的web服务中使用事务,性能或数据库吞吐量会发生显著变化吗?是的,这将有助于减少由于打开事务而导致的阻塞。但是,如果隔离级别不造成阻塞,则不会获得性能增益。 此外,如果上述场景中存在性能问题,则不会影响吞吐量或资源使用,但会导致高锁使用/等待,从而导致阻塞 简短回答 尽可能长地进行事务处理以保

目前,每当有人调用web方法并在web方法返回后提交时,我们的服务器端平台就会启动一个DB事务。所有web服务都是事务性的,即使是那些不更新数据库的服务


这样的决定对性能有什么影响?如果我停止在不更新数据库的web服务中使用事务,性能或数据库吞吐量会发生显著变化吗?

是的,这将有助于减少由于打开事务而导致的阻塞。但是,如果隔离级别不造成阻塞,则不会获得性能增益。 此外,如果上述场景中存在性能问题,则不会影响吞吐量或资源使用,但会导致高锁使用/等待,从而导致阻塞

简短回答 尽可能长地进行事务处理以保证正确性,但不能再这样做了

对于Web API中间层,只要确保在事务持续时间之外完成非必要的工作(如调用外部服务或处理HTTP请求/响应),将整个Web API方法封装到单个事务中通常是明智的

稍长的回答 在我所知道的所有关系型DBMS中,您不能仅仅“关闭”事务。如果不显式启动事务,它将隐式启动,并在SQL查询期间持续

因此,选择不是是否进行交易,而是应该进行多长时间。换句话说,每个查询应该有一个单独的事务,还是包含多个查询(以及多少个)?这是特定于您试图实现的逻辑1的,只有您才能在这里做出最终决策

与长期交易相关的成本。例如,一个INSERT/UPDATE/DELETE查询可能会对修改后的行进行锁定,然后可能会强制其他一些查询等待事务结束2。显式锁(例如Oracle下更新的
或SQL Server下带有(XLOCK)
也将保留到事务结束,具有类似的效果。在这样的情况下,事务结束得越早,被阻塞的事务就可以越早继续工作

此外,您应该始终尽量减少事务持续时间内的非必要工作。例如:

  • 避免在事务期间调用外部服务-在等待缓慢响应(或更糟的情况:网络超时)时,您不希望阻止其他事务。3
  • 应该在启动事务之前解析HTTP请求,并在事务之后构造HTTP响应

1例如,哪一组修改应该是原子的,或者哪些只读查询应该看到相同版本的数据(如果您使用的是快照隔离级别)

2在某些情况下,编写器可以阻止读卡器,或者只阻止编写器,或者根本不阻止任何内容。这在很大程度上取决于当前的事务隔离级别和具体的DBMS实现

3类似:避免在事务期间等待UI输入-在等待用户单击按钮时,您不想阻止其他事务(不适用于Web中间层,但我看到桌面应用程序正在这样做)