Sql-Server

SQL Server 2008 R2 - 在這種情況下,SQL 觸發器實際上是如何工作的?

  • October 13, 2018

我有一個名為**_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 種不同的觸發器:-

  1. 同時地
  2. 一個一個(根據它們保存的順序)
  3. 以任何隨機順序 SQL 似乎都合適

如果觸發器沒有一個一個地執行,那麼我該怎麼做才能讓他們先為 Id=5的記錄執行觸發器,然後在完成Id=6之後再為Id=7觸發。

觸發程式碼在呼叫它的事務範圍內執行。因為,正如您所說,這三個記錄中的每一個都是由單獨的會話插入的,​​這意味著完成了三個不同的事務,每個事務插入一個記錄並為該記錄執行觸發程式碼。

如果您“同時”啟動三個(或更多)事務,則除了設置事務隔離級別之外,您無法控制執行事務部分的執行順序。如果隔離級別設置為serializable,那麼觸發程式碼會執行“一個一個(按照它們保存的順序) ”;否則它似乎會“以任何隨機順序執行 SQL 似乎合適”,這取決於每個事務獲得的任何鎖。

警告:由於我沒有足夠的聲譽,我不能寫評論,這是評論。

AFAIK SQL 伺服器只有 FOR EACH STATEMENT 觸發器。這意味著觸發器將同時修改行。

如果要更新每一行,一個解決方案是使用游標,它們是性能殺手。也許更熟練的人有更好的方法。

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