Sql-Server
SQL Server 2008 R2 - 在這種情況下,SQL 觸發器實際上是如何工作的?
我有一個名為**_Test**的表,其中儲存了以下值。
主鍵:ID
我還在那張桌子上設計了一個觸發器
ALTER Trigger [dbo].[_Test_Data_Save] On [dbo].[_Test] For Insert As --Some custom algorithm which takes about 2-3 seconds to complete
現在,在同一微秒內從 3 個不同的會話中同時保存了 3 條記錄,如下圖所示。
問題
現在我的問題是觸發器將如何處理最後 3 條記錄?最後 3 條記錄是否會觸發 3 種不同的觸發器:-
- 同時地
- 一個一個(根據它們保存的順序)
- 以任何隨機順序 SQL 似乎都合適
如果觸發器沒有一個一個地執行,那麼我該怎麼做才能讓他們先為 Id=5的記錄執行觸發器,然後在完成Id=6之後再為Id=7觸發。
觸發程式碼在呼叫它的事務範圍內執行。因為,正如您所說,這三個記錄中的每一個都是由單獨的會話插入的,這意味著完成了三個不同的事務,每個事務插入一個記錄並為該記錄執行觸發程式碼。
如果您“同時”啟動三個(或更多)事務,則除了設置事務隔離級別之外,您無法控制執行事務部分的執行順序。如果隔離級別設置為serializable,那麼觸發程式碼會執行“一個一個(按照它們保存的順序) ”;否則它似乎會“以任何隨機順序執行 SQL 似乎合適”,這取決於每個事務獲得的任何鎖。
警告:由於我沒有足夠的聲譽,我不能寫評論,這是評論。
AFAIK SQL 伺服器只有 FOR EACH STATEMENT 觸發器。這意味著觸發器將同時修改行。
如果要更新每一行,一個解決方案是使用游標,它們是性能殺手。也許更熟練的人有更好的方法。