-- 保存点 savepoint begin declare is_error int default false;#是否出错的标志 declare continue handler for sqlexception set is_error=true;#声明异常处理程序,如果sql异常,则把标志为设置为true start TRANSACTION;#开启事务,则会同时失败,同时成功 savepoint s1;#创建保存点 insert into employee(id,name,salary) values(146,'cq',9000); savepoint s2; insert into employee(id,name,salary) values(101,'cq',9000); insert into employee(id,name,salary) values(102,'cq',9000); if is_error THEN rollback to savepoint s1;-- 还原到s1 insert into employee(id,name,salary) values(151,'cq',9000); insert into employee(id,name,salary) values(152,'cq',9000); commit; end if; end;
set autocommit=0;#关闭自动提交 #因为关闭了自动提交事务,则添加数据不会保存到数据库中 insert into employee(id,name,salary) values(143,'cq',9000); commit;#手动提交所有未执行的数据 #由于是关闭自动提交的方式开启的事务,所以每个事物结束其后的操作自动开启新的事物 insert into employee(id,name,salary) values(258,'wd',8000); #该操作属于新启的事物
3. 事物的隐式提交
由于事物不能被嵌套,所以当新事物开启时其前的旧事物会被隐式提交。如下情况会导致事物被隐式提交:
1)新事物的开启会导致旧事物的隐式提交
1 2 3 4 5
START TRANSACTION; INSERT INTO `dm_性别`(性别名称) VALUES('不限');#该操作会被隐式提交 START TRANSACTION; INSERT INTO `dm_性别`(性别名称) VALUES('男女'); ROLLBACK;