Sql-Server

獨立的應用程序會導致回滾到彼此的事務嗎?

  • November 2, 2018

我有一個基於 SQL Server 建構的數據庫

應用程序-1$$ Legacy App $$:

用 C# 編寫,並在上述數據庫上執行事務。

應用程序-2$$ New application being developed $$:

用 Python 編寫,並在上述數據庫上執行事務。

注意事項:

  • 這些應用程序訪問同一組表並執行類似的操作。
  • 隨著時間的推移,我們正試圖從較舊的應用程序過渡到較新的應用程序。
  • 我發現系統中發生了幾個死鎖和回滾。

問題

  1. 我想了解通過一個應用程序執行的事務是否有可能影響來自獨立的其他應用程序的事務。
  2. 這些場景是由 DBMS 本身在內部處理還是必須在應用程序級別處理?

我想了解通過一個應用程序執行的事務是否有可能影響來自獨立的其他應用程序的事務。

直接說不行。根據定義,每個事務都是“單個工作單元”,並且是其自身的本地事務。也就是說,我的交易不能成為您交易的一部分。我不能明確告訴你回滾或送出。

但是,如果兩個事務處理相同的數據,它們會相互影響。如果兩個事務之間發生死鎖,一個是受害者(被殺死),另一個成功。在這種情況下,我的事務導致數據庫引擎對您的事務發出回滾,但我的事務中沒有任何內容直接影響您的事務。雖然永遠無法 100% 避免死鎖,但有一些方法可以減輕它們的風險和影響

正如 El.Ham 所提到的,單獨的事務也可能導致阻塞,從而導致查詢暫停。這可能會導致應用程序執行緩慢甚至超時,具體取決於您的連接配置方式。

這些場景是由 DBMS 本身在內部處理還是必須在應用程序級別處理?

這取決於。如果您擔心死鎖(我認為是),那麼您可能希望應用程序具有重試邏輯,以便自動重試死鎖事務。這可以使用T-SQL或在應用程序級別完成。

如果您的程式碼不影響Isolation Level您的查詢,則您的應用程序都不能對Rollback. 他們只能Suspend彼此。

使用SQL Server Profiler跟踪您的應用程序並查看是什麼使您的查詢回滾。

要補充的是,當Rollback發生這種情況時它們會執行哪些查詢?我的意思是SELECT, INSERT,DELETEUPDATE?

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