2011-02-03 131 views
0

有沒有一種方法而沒有要更新的記錄在審計表中的記錄(通過觸發器)被鎖定,由於其觸發觸發器是在事務內的更新。SQL更新沒有數據庫鎖定

因此,我們有一個用戶表和一個觸發器,用於插入,更新,刪除和記錄更改後的值給某個審計表,但我不希望審計表被鎖定,以防止觸發其他觸發器來執行操作在審計表上。

編輯:只是爲了澄清,我有問題是多個表通過不同的觸發器到同一個審計表上報,這樣的更新一個表鎖被更新的所有其他表。至於關於事務回滾是什麼的擔憂,這不是一個問題,因爲審計表僅用於更改跟蹤,並且如果記錄回滾,如果審計表不回滾則不是問題。

我想到了一種可能的方式,但我不知道這是否可行(或如何去做),有沒有一種方法可以讓觸發器使用新連接而不是最初調用的連接?

+0

如果事務回滾,您是否真的想要另一個進程在審計表中讀取記錄? – 2011-02-03 23:57:44

+0

我會假設,是的,你想要審覈表的數據被鎖定。您真正的問題可能是您在審計表上有一個連續的(可能是集羣的)主鍵索引,這會對審計表的葉節點進行熱點檢查,導致審計表中的所有插入操作全部進入相同的葉節點頁面時間。將主鍵更改爲更隨機的排序方式,這可以解決您的鎖定問題。 – 2011-02-04 00:10:23

回答

0

這是不可能創建一個不至少將一個寫鎖被寫入記錄/頁的動作。否則SQL Server會一直存在一致性問題。你應該從相反的角度看 - 需要訪問的審計表(審計通常只讀很少意味着沒有更新)應使用其他進程

SET TRANSACTION ISOLATION LEVEL SNAPSHOT 
or 
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

哪樣髒讀取(或無鎖版本)從審計表

如果必須..
有分離使用服務代理通過而不是插入數據到一箇中間表和具有該SSSB臺異步激活線程寫入從事務寫入偷偷摸摸審計記錄,讓您的原始長時間運行的交易保持不變mmitted。