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

rabitsky 2016-09-28 11:30:47
各位大牛大家好,今天遇到一个问题,如题所示。脚本如下:

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,不太熟悉,请求大师指点,谢谢
...全文
730 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
rabitsky 2016-09-29
  • 打赏
  • 举报
回复
谢谢各位,其实不是autocommit的事情,前面都开启事务了 start transaction; 是因为字符过长存不下 不是sqlexception, 而是sqlwarning,所以只用sqlexception捕获不到改异常,写成declare exit handler for sqlexception, sqlwarning, not found这样就可以了
LongRui888 2016-09-29
  • 打赏
  • 举报
回复
你可以先试试把autocommit改为0,然后再执行,看看有没有问题 一般情况下,既然已经开启了start transaction,那么autocommit应该是不会影响事务的提交方式的。
不懂编程 2016-09-28
  • 打赏
  • 举报
回复
mysql默认开启了自动提交,所以会出现你说的问题,如果关闭自动提交,数据长度大于字段长度,因为默认是松散模式,所以会自动截取,不会报错

56,803

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧