Ale*_*xei 7 sql-server transaction select sql-server-2016
我正在处理一个相当古老的 .NET 项目,并引入了一些新功能(在顶部),这些功能产生了以下副作用:所有生成的 SELECT(或组)都包含在BEGIN TRAN ... COMMIT语句中。
这听起来很愚蠢,但要摆脱它需要进行大量更改,而我负担不起。我的假设是这基本上意味着每组 SELECT 的小开销(应用程序和 SQL Server 之间的 BEGIN TRAN 和 COMMIT)。
我想知道是否还有更多内容(额外锁定?)。
问题:如果选择语句包含在 BEGIN TRAN ... COMMIT 中,是否有任何副作用?
答案取决于您的 .NET 项目在访问 SQL Server 时设置的隔离级别。
如果是READ COMMITTED(默认),那么实际上没有任何额外的开销(除了正在执行的附加BEGIN TRAN和END TRAN语句)。您可能认为额外的信息会被写入事务日志,但在需要记录的事情发生之前,事务不会真正“开始”。我在这里写过:交易不从 BEGIN TRAN 开始
如果您使用SERIALIZABLE隔离级别,您可能会因为这些SELECT查询将在事务期间持有它们所采用的锁而感到烦恼。如果您TransactionScope在 .NET 项目中使用,这可能会在您没有意识到的情况下发生,因为SERIALIZABLE默认情况下使用它(有关演示,请参阅我的博客文章:TransactionScope 考虑令人讨厌)。
总而言之,如果使用默认隔离级别,那么按照您所描述的方式保留事物并没有太大的缺点。不过,您需要注意隔离级别。
| 归档时间: |
|
| 查看次数: |
206 次 |
| 最近记录: |