MySQL事务之保存点
MySQL事务之保存点
MySQL事务保存点允许将事务划分为多个较小的、更易于管理的部分,并在需要时回滚到事务中的特定点。
如,g_user有以下数据
+----+--------+------+
| id | t_name | age |
+----+--------+------+
| 1 | user1 | 1 |
| 2 | user2 | 2 |
| 3 | user03 | 3 |
| 4 | user04 | 4 |
| 5 | user05 | 5 |
| 12 | user12 | 12 |
| 13 | user13 | 13 |
| 18 | user18 | 18 |
| 22 | user22 | 22 |
| 23 | user21 | 23 |
+----+--------+------+
执行事务
START TRANSACTION;
select * from tp where id > 2 is not null for update ;
savepoint a;
update tp set age = 20 where id is not null;
rollback to a;
commit ;
再次查询g_user,发现结果和之前一模一样,因为rollback to混滚到了savepoint定义之前的状态,也就是说,savepoint 还原点到rollback to 还原点之间的所有sql操作全部不会生效。
⚠️ 注意
savepoint和rollback to必须搭配使用- 如果有需要,可以删除还原点
release savepoint还原点
既然有保存点,那么我们在写代码时如何判断是否执行还原呢?这就需要用到MySQL事务了
create procedure Clear_G_USER()
begin
DECLARE row_count int unsigned default 0;
# 开启事务
START TRANSACTION;
SAVEPOINT a;
# 统计总数
SELECT count(id) INTO @row_count from g_user where id is not null;
# 当表中数据量达到9w,转移表中数据
if @row_count > 90000 THEN
insert into g_user_bak select * from g_user;
delete from g_user where id is not null;
else
# 如果没有行被更新,则回滚
ROLLBACK TO SAVEPOINT a;
end if;
commit;
end;
本文来自博客园,作者:勤匠,转载请注明原文链接:https://www.cnblogs.com/JarryShu/articles/18391663

浙公网安备 33010602011771号