2012-02-28 82 views
1

我有一個關於觸發器的問題。 的情況是這樣的基本觸發器鎖定問題

Create Procedure 
begin 
    Insert into XYZ (a) values (b) 
end 

現在我已經放在扳機上INSERT - AFTER上表XYZ。 在該觸發器存在業務邏輯這需要2-3秒來執行它,業務邏輯與其他數據庫表不是在XYZ表進行

所以我需要在這裏證實,一旦INSERT是已經完成,那麼表XYZ將準備好插入另一條記錄,否則它將被鎖定,直到觸發器完成?

編輯

我做了一些更多的研究這個問題,並解釋它下面 在INSERT - 觸發,我已經把我的業務邏輯,也低於線

WAITFOR DELAY '00:01' 

現在當我嘗試執行上面的SP時,SP未完成1分鐘(因爲我已經指定了觸發器中1分鐘的延遲),並且在此期間表XYZ也被鎖定。

因此,這使我得出結論,即使您沒有在觸發器中使用同一個表,觸發器也會對錶進行LOCKS鎖定。我對嗎?有人在這裏有不同的觀點嗎?

+1

你應該看看這裏:http://stackoverflow.com/questions/2606226/sql-server-2008-running-trigger-after-insert-update-locks-original-table – 2012-02-28 12:12:07

回答

2

的問題和回答@Hallainzil鏈接以顯示一種方法:

  • 總結所有的表插入和更新存儲過程
  • 的SP則可以完成更多的業務邏輯而維持鎖


還有另一種方法,則略有梅西耶在幾個方面,但也更靈活在許多方面:

  • 保留哪些領域已經被插入或更新
  • 有一個代理的工作反覆火災或隔夜處理這些更改

您可以使用觸發器來保持這一記錄的記錄。也許有一個LastModifiedTime字段,或hasBeenProcessed字段,甚至是一個單獨的跟蹤表。它可以以多種方式完成,並且維護的權重相對較輕(沒有業務邏輯發生)。

這會盡快從任何鎖釋放您的表。這也意味着您可以處理能夠直接寫入表格的登錄,從而繞過您的存儲過程。

不利的一面是您的INSERTS/UPDATES和您的業務邏輯異步處理。您的其他SQL代碼可能需要檢查業務邏輯是否已完成,而不是假設INSERT和業務邏輯總是以原子方式發生。


所以,是的,有辦法避免這種鎖定。但是你爲你的模型引入了額外的限制和/或複雜性。這絕不是一件壞事,但需要在整體設計中考慮。

+0

謝謝你的回答,但我正在尋找觸發器是否鎖定桌子的答案。我已經完成了一些研發並編輯了我的問題。請看看,看看你是否可以在那裏給你額外的想法 – user867198 2012-02-29 06:38:21

+1

@ user867198 - 請參閱你問題的評論部分鏈接到的答案,我的答案提到 - 是的,整個觸發器代碼的持續時間是綁定的由INSERT創建的隱式事務;在INSERT和Trigger的持續時間內創建一個鎖。這個答案和評論中提到的答案提供了處理這個事實的替代方法。 – MatBailie 2012-02-29 11:07:32