各位大神大家好,今天遇到一个问题,如题所示。脚本如下:
DROP PROCEDURE IF EXISTS sdypt.pr_add_user_token; CREATE PROCEDURE sdypt.`pr_add_user_token` (in iuser_id int, in ilogin_name varchar(100), in ipush_channel varchar(50), in ipush_token varchar(100), in iproduct_id varchar(100), in iproduct_version varchar(50) ) SQL SECURITY INVOKER begin begin declare exit handler for sqlexception rollback to savepoint s_token; start transaction; savepoint s_token; insert into tb_relat_user_token (user_id, login_name, push_channel, -- varchar(50) push_token, insert_time, product_id, product_version) select iuser_id, ilogin_name, ipush_channel, ipush_token, sysdate(), iproduct_id, iproduct_version; insert into tb_relat_user_token_ex (user_id, login_name, push_channel, -- varchar(2) push_token, insert_time, update_time, product_id, product_version) select iuser_id, ilogin_name, ipush_channel, ipush_token, sysdate(), sysdate(), iproduct_id, iproduct_version; end; commit; end; -- 调用 call pr_add_user_token(30164871, "120ab", "JiGuang", "100d85590941a61245b","shandong_tc_android","1.7.2");
说明:第三个参数ipush_channel “JiGuang”,
插入表tb_relat_user_token时长度足够,但是插入表tb_relat_user_token_ex时长度不够,
按理说应该走异常捕获流程【declare exit handler for sqlexception rollback to savepoint s_token;】,进行事务回滚。
但是最后的结果是,第一个插入成功了,第二个插入失败了,看上去没走异常捕获流程,事务没回滚,这是为什么呢?
刚研究mysql,不太熟悉,请求大师指点,谢谢
解决方案
20
mysql默认开启了自动提交,所以会出现你说的问题,假如关闭自动提交,数据长度大于字段长度,原因是默认是松散模式,所以会自动截取,不会报错
30
你可以先试试把autocommit改为0,然后再执行,看看有没有问题
一般情况下,既然已经开启了start transaction,那么autocommit应该是不会影响事务的提交方式的。
一般情况下,既然已经开启了start transaction,那么autocommit应该是不会影响事务的提交方式的。