mysql存储过程事务和捕获异常信息

注:以下脚本均是在公司的mysql环境上跑的,版本号是5.6.16-log
其他版本可根据关键字 get diagnostics 自行百度。

drop table if exists simon_task;
drop table if exists simon_log;
create table simon_task(task varchar(200));-- 业务表
CREATE TABLE simon_log (test001 varchar(2000));-- 日志表

-- 失败测试
drop procedure if exists print_exception_msg;
create procedure print_exception_msg()
begin
declare v_commit int default 2; -- 定义事务用,1为正常,-10为失败
declare msg text;-- 记录错误信息
-- 异常的时候msg捕获报错信息
declare continue handler for sqlexception
begin get diagnostics condition 1  msg = message_text;set v_commit = -10; end ;

start transaction;-- 设置事务

-- 业务表相关
insert into simon_task values (‘111111111‘);
insert into staff (sda) values(‘111111111‘);

if v_commit = -10 then
ROLLBACK;
-- 记录报错信息到日志
insert into simon_log values (msg);
end if ;

end;

call print_exception_msg;
-- 预期:insert into staff (sda) values(‘as‘); 这句是错误的,所以simon_task表和staff表都不应该insert成功,并且simon_log记录报错原因
select * from simon_task ;
select * from simon_log ;
-- 实际:同预期。

-- 成功测试
drop procedure if exists print_exception_msg2;
create procedure print_exception_msg2()
begin
declare v_commit int default 2; -- 定义事务用,1为正常,-10为失败
declare msg text;-- 记录错误信息
-- 异常的时候msg捕获报错信息
declare continue handler for sqlexception
begin get diagnostics condition 1  msg = message_text;set v_commit = -10; end ;

start transaction;-- 设置事务

-- 业务相关语法
insert into simon_task values (‘2222222222‘);
insert into simon_task values (‘3333333333‘);

if v_commit = -10 then
ROLLBACK;
insert into simon_log values (msg);
end if ;

end;

call print_exception_msg2;
-- 预期:simon_task表新增两条记录,simon_log表没有新增的记录

select * from simon_task ;
select * from simon_log;
-- 实际:同预期。

原文地址:https://www.cnblogs.com/Simonsun002/p/9788353.html

时间: 2025-01-22 06:46:17

mysql存储过程事务和捕获异常信息的相关文章

mysql存储过程事务回滚

SQL过程代码: DELIMITER $$ CREATE DEFINER=`root`@`localhost` PROCEDURE `test_procedure`() BEGIN DECLARE errno int; declare continue HANDLER for sqlexception begin rollback; set errno=1; end; start transaction; set errno=0; insert into test(name) values ('

mysql 存储过程事务

1 DECLARE t_error INTEGER DEFAULT 0; 2 DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1; 3 START TRANSACTION; 7 delete from client; 8 IF t_error = 1 THEN 9 ROLLBACK; 10 ELSE 11 COMMIT; 12 END IF; 事务关键代码. 调用存储过程:Call 存储过程名字;

mysql存储过程之事务篇

mysql存储过程之事务篇 事务的四大特征: ACID:Atomic(原子性).Consistent(一致性).Isolated(独立性).Durable (持久性) MySQL的事务支持不是绑定在MySQL服务器本身,而是与存储引擎相关: sql代码  1. MyISAM:不支持事务,用于只读程序提高性能 2. InnoDB:支持ACID事务.行级锁.并发 3. Berkeley DB:支持事务 事务隔离级别标准: ANSI(美国国家标准学会)标准定义了4个隔离级别,MySQL的InnoDB都

mysql存储过程中使用事务

1 DROP PROCEDURE IF EXISTS test_sp1 2 CREATE PROCEDURE test_sp1( ) 3 BEGIN 4 DECLARE t_error INTEGER DEFAULT 0; 5 DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1; 6 7 START TRANSACTION; 8 INSERT INTO test VALUES(NULL, 'test sql 001'); 9 INSER

Mysql存储过程包含事务,且传入sql数据执行

有一个需求是:在一个图片按钮上点击,在按钮的上方弹出一个弹框,根据弹框的内容页面做不同的显示.这个其实没什么难的,主要是要控制好弹框的显示位置,让弹框显示在图片的正上方的中间. 一开始是用的Popupwindow,但是Popupwindow不能给弹窗之外的页面加一个半透明的蒙层,当然可以在页面上加一个专门的作为蒙层的View,但是很显然,这么做会代码变得很恶心,于是又换成了Dialog,因为Dialog弹出的时候会自动加一个蒙层的,但是这个时候,弹框显示位置的Y坐标不对了,后来一顿查,原来Dia

MySQL存储过程之事务管理

ACID:Atomic.Consistent.Isolated.Durable 存储程序提供了一个绝佳的机制来定义.封装和管理事务. 1,MySQL的事务支持 MySQL的事务支持不是绑定在MySQL服务器本身,而是与存储引擎相关: Java代码 1         MyISAM:不支持事务,用于只读程序提高性能 2         InnoDB:支持ACID事务.行级锁.并发 3         Berkeley DB:支持事务 隔离级别: 隔离级别决定了一个session中的事务可能对另一个

Mysql存储过程包括事务,且传入sql数据运行

有这样一个需求.要求在mysql存储过程中使用到事务,并且运行的是动态的sql语句 代码例如以下: BEGIN DECLARE in_data TEXT; /** 标记是否出错 */ DECLARE errno INT DEFAULT '0'; /** 假设出现sql异常.则将t_error设置为1后继续运行后面的操作 */ DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK;SET errno = 1; END; START TRA

MySQL的事务

MySQL的事务 1.事务:事务是由一步或者几步数据库操作序列组成的逻辑执行单元,这一系列操作要么全部执行,要么全部放弃执行. 2.事务具备的四个特性(简称为ACID性): (1)原子性(Atomicity): 事务是应用中最小的执行单位,具有不可再分的特征,事务是应用中最小的逻辑执行体: (2)一致性(Consistency): 事务执行的结果必须使数据库从一个一致性状态转变到另一个一致性的状态.当数据库只包含事务成功提交的结果时,数据库处于一致性状态.如果系统运行发生中断,某个事务尚未完成而

MySQL存储过程之细节

1. ALTER and DROP 1 ALTER PROCEDURE p6 COMMENT 'Unfinished' // 2 DROP PROCEDURE p6 // 2. 与Oracle / SQL Server / DB2 / ANSI比较 1) 与Oracle比较 1> 摘要: a. Oracle允许在打开后再声明;MySQL必须在开始的时候使用 b. Oracle允许"CURSOR cursorname IS"这样的声明方式;MySQL必须使用"DECLAR