2013-03-27 41 views
1

我在Mysql 5.5版本中實現了一個典型的「審計日誌」觸發器。我使用AFTER INSERT將表用戶的插入行復制到我的'audit_log'表中。在原始事務回滾之後,Mysql觸發器插入仍然存在

因此,對於這個順序:

BEGIN; 
insert into user (name) values ('joe'); 
<--trigger fires, adds new row to audit_log table--> 
COMMIT; 

然後我得到了 'AUDIT_LOG' 與 '喬' 新行。大。

但是,即使觸發觸發器的插入操作被其封閉事務中止,我的觸發器的結果似乎也應用了。

因此,對於這個順序:

BEGIN; 
insert into user (name) values ('mary'); 
<--trigger fires, adds new row to audit_log table--> 
ROLLBACK; 

我仍然在AUDIT_LOG新行「瑪麗」,這指的是從來沒有承諾我的用戶表中的數據結束了。這似乎很明顯是錯誤的。

看來在Postgres中執行的觸發更新在原始事務中執行,這是我期望發生的事情。任何人都有這在MySQL的經驗?也許有一個設置我錯了?

我注意到this question意味着所有更新都發生在原始事務中。但是,答案指的是觸發器上的Mysql手冊頁,實際上根本沒有提到「轉換」。

+0

我剛剛在MySQL 5.5中做了一個快速測試,觸發器似乎回滾了。你使用的是什麼版本的MySQL? – Steve 2013-03-27 21:20:47

+0

mysql通常在事務中支持觸發器。請參閱http://stackoverflow.com/questions/13823165/mysql-trigger-with-transaction-insert-or-update – didierc 2013-03-27 21:38:47

+0

嗯..我當然不是在試圖避免交易。我會嘗試創建一個更有限的測試用例。 – 2013-03-28 22:06:29

回答

2

原來我的審計表使用了MyISAM引擎,這當然會阻止它正確地遵守事務。

我的同事說我欠拉里埃裏森道歉。

Larry,對不起,我懷疑Mysql的事務語義。