Sql-Server-2008
如何在避免死鎖的同時僅查詢已送出的數據
我有一個系統將批量查詢編寫為事務(以保持一致性),每個事務可以是 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 中的死鎖
一旦您知道您要解決的問題是什麼,您就可以著手實際解決它。