Sql-Server

如果選擇語句包含在 BEGIN TRAN … COMMIT 中,是否有任何副作用?

  • August 7, 2020

我正在處理一個相當老的 .NET 項目,並引入了一些新功能(在頂部),這些功能產生了以下副作用:所有生成的 SELECT(或組)都包含在BEGIN TRAN ... COMMIT語句中。

這聽起來很傻,但要擺脫它需要做很多改變,而我負擔不起。我的假設是這基本上意味著每組 SELECT 的成本很小(應用程序和 SQL Server 之間的 BEGIN TRAN 和 COMMIT 往返)。

我想知道是否還有更多內容(額外鎖定?)。

**問題:**如果選擇語句包含在 BEGIN TRAN … COMMIT 中,是否有任何副作用?

答案取決於您的 .NET 項目在訪問 SQL Server 時設置的隔離級別。

如果它是READ COMMITTED(預設值),那麼實際上並沒有任何額外的成本(除了正在執行的額外BEGIN TRANEND TRAN語句)。您可能認為附加資訊會被寫入事務日誌,但在需要記錄的事情發生之前,事務並沒有真正“開始”。我在這裡寫過這個:事務不要從 BEGIN TRAN 開始

如果您使用SERIALIZABLE隔離級別,您可能會因為這些SELECT查詢將持有它們在事務期間所佔用的鎖而感到煩惱。如果您TransactionScope在 .NET 項目中使用,這可能會在您沒有意識到的情況下發生,因為SERIALIZABLE預設情況下使用它(有關展示,請參閱我的部落格文章:TransactionScope 被認為很煩人)。

總而言之,如果使用預設隔離級別,那麼按照您所描述的方式保留內容並沒有太大的缺點。不過,您需要注意隔離級別。

引用自:https://dba.stackexchange.com/questions/273404