Sql-Server-2008

如何在避免死鎖的同時僅查詢已送出的數據

  • April 9, 2015

我有一個系統將批量查詢編寫為事務(以保持一致性),每個事務可以是 30-100 個查詢集。這些是在多個表上完成的

同時,使用內部選擇對同一表進行讀取查詢 - SELECT FROM table1… IN (SELECT from table 2…)

為了清楚起見 - 有一個寫入器執行緒寫入事務(每個事務寫入所有表)和許多讀取器執行緒。

我收到死鎖錯誤。1.死鎖是否與IN選擇有關?2. 我怎樣才能使讀取查詢只提供送出的數據,但不一定要等待目前事務送出(意味著它可以返回以前送出的數據) 3. 死鎖是否可能是事務的結果太長了完全的?

謝謝!

快照隔離 (SI) 是正確的方法。感謝@JohnSansom 和@EricHiggins 引導我了解這些資訊。由於這可能是解決死鎖的一種選擇(因為它是非阻塞訪問),我也會嘗試修復死鎖本身,但這是另一個問題

這個頁面

**快照隔離 (SI):**這是一種新的專有隔離級別,可為讀取操作提供非阻塞訪問。SI 下的事務在事務開始時看到數據庫的快照。事務隔離級別不會自動映射到 SI,因此您必須更改應用程序以訪問 SI 隔離級別下的數據。

  • 優點: 對事務一致數據的非阻塞訪問。比可重複讀取更高的一致性。
  • **缺點:**維護行版本的一些成本。
  • 用途: 在事務中跨多個語句獲得對一致數據的非阻塞訪問。

通過擷取 SQL Server Profiler 死鎖圖事件來準確地確定是什麼,而不是對可能負責的原因進行理論化。

如何使用 Profiler 跟踪 SQL Server 中的死鎖

一旦您知道您要解決的問題是什麼,您就可以著手實際解決它。

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