我正在处理一个相当老的 .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 被认为很烦人)。总而言之,如果使用默认隔离级别,那么按照您所描述的方式保留内容并没有太大的缺点。不过,您需要注意隔离级别。