MySQL存储过程中的事务管理实例说明

作者:袖梨 2022-06-29

mysql存储过程中事务SQL代码 

delimiter $$ 
use test$$ 
create procedure t_insert_table() 
begin 
    /** 标记是否出错 */ 
    declare t_error int default 0; 
    /** 如果出现sql异常,则将t_error设置为1后继续执行后面的操作 */ 
    declare continue handler for sqlexception set t_error=1; -- 出错处理 
    /** 显式的开启事务,它开启后,事务会暂时停止自动提交*/ 
    -- start transaction; 
    /** 关闭事务的自动提交 */ 
    set autocommit = 0; 
    insert into t_bom_test(parent_id,child_id) values('D','abc'); 
    insert into t_trigger_test(name,age) values('zhangsan',null); 
    /** 标记被改变,表示事务应该回滚 */ 
    if t_error=1 then 
        rollback; -- 事务回滚 
    else 
        commit; -- 事务提交 
    end if; 
    -- rollback; 
    -- commit; 
end$$ 
delimiter ; 

写完这个后,又发现书本上有很多地方都是直接在开始set autocommit = 0;在最后commit或rollback就完成了,我自己试验了一下,结果出现如下问题:
1)当直接在开始set autocommit = 0;在最后commit或rollback后会出现一下错误:
Error Code: 1048. Column 'age' cannot be null ,然后查看了一下数据库表,发现第一条insert语句执行成功并成功commit了,而第二条则没有;

2)当SQL代码 
/** 标记是否出错 */ 
declare t_error int default 0; 
/** 如果出现sql异常,则将t_error设置为1后继续执行后面的操作 */ 
declare continue handler for sqlexception set t_error=1; -- 出错处理 

这两句代码存在,而结束时不做if-else判断,直接执行rollback语句时,发现即使两条insert语句都执行成功了,但到最后仍然会被回滚掉;当直接执行commit语句时,发现如果第一条insert语句执行成功,第二条insert语句执行失败时,查看数据库表,会发现事务没有回滚。

 

相关文章

精彩推荐