同一个事物,一个sql语句insert成功,另一个sql语句insert失败,为什么捕获不到异常回滚呢

MySql 码拜 3年前 (2017-04-13) 780次浏览
各位大神大家好,今天遇到一个问题,如题所示。脚本如下:

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应该是不会影响事务的提交方式的。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明同一个事物,一个sql语句insert成功,另一个sql语句insert失败,为什么捕获不到异常回滚呢
喜欢 (0)
[1034331897@qq.com]
分享 (0)