这就是问题所在:MySQL触发器中是否可以执行ROLLBACK操作?
如果答案是肯定的,请说明如何操作。
我发现这个功能自MySQL 5.5起存在,之前的版本不支持。
触发器没有回滚或提交。要启动任何回滚操作,您必须引发异常。因此,您的插入/更新/删除命令将中止。回滚或提交操作必须围绕您的SQL命令引发。
要引发异常,在您的XXX触发器中(例如):
create trigger Trigger_XXX_BeforeInsert before insert on XXX
for each row begin
if [Test]
then
SIGNAL sqlstate '45001' set message_text = "No way ! You cannot do this !";
end if ;
end ;
如果触发器引发异常,那么将会中止事务,实际上是回滚操作。这个方案对您是否可行?
来源:http://dev.mysql.com/doc/refman/5.1/en/trigger-syntax.html
触发器不能使用明确或隐式启动或结束事务的语句,如START TRANSACTION、COMMIT或ROLLBACK。
并且
对于事务性表,一个语句的失败应该导致语句执行的所有更改回滚。触发器的失败会导致语句失败,因此触发器的失败也会导致回滚。对于非事务性表,这种回滚是不可能的,因此尽管该语句失败,但在出错点之前所做的任何更改仍然有效。