2010-04-14 123 views
8

我很快瀏覽了MySQL手冊,但沒有找到有關我的問題的確切信息。這裏是我的問題:如果我有一個InnoDB表A,其中兩個觸發器由'AFTER INSERT ON A'和'AFTER UPDATE ON A'觸發。更具體地講,例如:一個觸發器定義爲:MySQL事務和觸發器

CREATE TRIGGER test_trigger AFTER INSERT ON A 
     FOR EACH ROW 
         BEGIN 
         INSERT INTO B SELECT * FROM A WHERE A.col1 = NEW.col1 
         END; 

可以忽略BEGINEND之間的查詢,基本上我的意思是這個觸發器將插入幾行到表B中這也是一個InnoDB表。

現在,如果我啓動了一個事務,然後在表A中插入許多行,例如:10K行,如果沒有與表A關聯的觸發器,所有這些插入操作都是原子操作,這是肯定的。現在,如果表A與多個插入/更新觸發器相關聯,這些觸發器向表B和/或表C等插入/更新許多行,所有這些插入和/或更新是否仍然是原子的?

我認爲它仍然是原子的,但它有點難以測試,我在手冊中找不到任何解釋。任何人都可以確認嗎?

+0

是的肯定在DB/2 ... – 2010-04-14 03:59:57

+0

你能指出它在手冊中提到的地方嗎? – WilliamLou 2010-04-14 17:51:21

+0

可能重複的[是觸發器事務嗎?](http://stackoverflow.com/questions/37749288/are-triggers-transaction) – Sandeep 2016-06-11 11:46:08

回答

5

與原子,你的意思是,如果在觸發一個語句失敗,整個語句失敗。是的 - 觸發器是在語句事務的上下文中完成的。當然,如果沒有交易,那麼就沒有交易背景。

對於事務性表,語句失敗應該導致回滾語句執行的所有更改。觸發失敗會導致語句失敗,因此觸發失敗也會導致回滾。對於非事務性表,這種回滾無法完成,因此雖然語句失敗,但在錯誤點之前執行的任何更改仍然有效。

而且您不允許在觸發器中啓動事務。

+0

感謝提示,不能在觸發器中開始/結束事務。 +1 – 2016-02-11 05:48:09