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 ('kaka');
	insert into test(id, name) values(1,'papa');
	commit;
	select errno;
END

过程说明:

1、首先表中已经存在一条记录(1,‘baby‘);

2、调用测试存储过程;

3、该过程首先声明error变量,和一个SQL异常处理handler,该handler触发时会回滚事务,并将error置为1;

事务开始,将error置为0,插入一条数据name为‘kaka’,再插入一条数据(1,‘papa‘),然后提交;

但第二次插入数据时,主键id已存在,此处会报异常触发我们的SQL异常处理handler。实现回滚并将error置为1;

查看error值;

4、调用存储过程之后查看测试表中的数据是否回滚;

调用前:

调用中:

调用后:

建库SQL:

CREATE DATABASE  IF NOT EXISTS `test`;
USE `test`;
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

综上,可以通过在存储过程中声明异常处理handler使得我们的事物达到回滚效果。

时间: 2024-12-20 11:59:50

mysql存储过程事务回滚的相关文章

Mysql数据库无法使用事务回滚

package jdbc02; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import org.junit.Test; import jdbc02.*; public class TransactionTest { /**  * Tom 给Jerry 汇款500元  *   * 关于事务:  * 1. 如果多个操作,每个操作使用的是自己的单独的连接,则无

【MySQL】MySQL事务回滚脚本

MySQL自己的 mysqlbinlog | mysql 回滚不好用,自己写个简单脚本试试: 想法是用mysqlbinlog把需要回滚的事务区域从mysql-bin.file中找到,然后通过脚本再插入DB. ## INSERT 需要将新增数据删除 对应DELETE ## DELETE 需要将删除数据恢复 对应INSERT ## UPDATE 需要将修改数据恢复 对应UPDATE ## 手动读取BINLOG,并找到对应位置和对应事务 ## 手动删除除事务外的其他说明语句 INSERT回滚最简单,其

mysql事务回滚

mysql使用事务前需确定存储引擎为innodb,譬如删除一个人员数据,会删除和这个人有关的一些数据删除,这个时候就会用到事务,出现一个删除错误整个删除事务就会取消. 事务回滚步骤: /*创建roll表*/CREATE TABLE roll(    id int unsigned primary key auto_increment comment '主键',    names varchar(64) not null default '' comment '姓名')CHARSET =UTF8

为什么mysql事务回滚后, 自增ID依然自增

事务回滚后,自增ID仍然增加,回滚后,自增ID仍然增加.比如当前ID是7,插入一条数据后,又回滚了.然后你再插入一条数据,此时插入成功,这时候你的ID不是8,而是9.因为虽然你之前插入回滚,但是ID还是自增了. 如果你认为自增ID不应该被事务化,那么其他事务不得不等待着,检查自增ID是被使用还是被回滚,这就导致阻塞. 比如下面的例子,A表使用自增ID. User 1 ------------ begin transaction insert into A ... insert into B ..

MySQL(22):事务管理之 事务回滚

1. 在操作事务的时候,如果发现当前事务操作是不合理的,此时只要还没有提交事务,就可以通过回滚取消当前事务,接下来就针对事务的回滚进行详细讲解. 2. 为了演示回滚操作,在上一个笔记案例基础之上,此时a账户有1000元,b账户也有1000元,开启一个事务,通过update语句将a账户的100元转给b账户,具体语句,如下: start transaction; update account set money=money-100 where name='a'; update account set

JDBC 事务回滚

package jdbcstu; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; public class TransactionTest { public static void main(String[] args) { Connection conn=null; try { conn=getConnectio

ThinkPHP实现事务回滚示例代码

ThinkPHP的事务回滚示例如下: $m=D('YourModel');//或者是M(); $m2=D('YouModel2'); $m->startTrans();//在第一个模型里启用就可以了,或者第二个也行 $result=$m->where('删除条件')->delete(); $result2=m2->where('删除条件')->delete(); if($result && $result2){ $m->commit();//成功则提交

配置Spring JDBC的事务回滚失效

今天配置Mysql DBCP连接池事务回滚失效,竟然浪费了我一下午的时间去调研,问了好多人也都没发现,最后还得靠自己,总结问题如下: 1.Mysql数据库用的是MyISAM表结构而非InnerDB(浪费了两个小时) 2.网上说的默认情况下,一个有事务方法, 遇到RuntiomeException 时会回滚 . 遇到 受检查的异常 是不会回滚 的. 要想所有异常都回滚,要加上 @Transactional( rollbackFor={Exception.class,其它异常}) . 3.配置DBC

PHP 事务回滚实例

#若已存在该表,就将其删除:否则创建新的表.DROP table IF EXISTS users;CREATE TABLE users( `user_name` varchar(5) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8; #若已存在该存储过程,就将其删除:否则创建新的存储过程DROP PROCEDURE IF EXISTS inserOrUpdate;CREATE PROCEDURE inserOrUpdate()BEGIN#----