MySQL的savepoint分析

写在前面

本文看下MySQL的savepoint相关内容。

1:什么是savepoint

savepoint是事务中一个概念,允许在事务执行的过程中暂存事务执行到当前所产生的修改,这样当我们需要回滚事务时就可以选择回滚到某个保存点,而不用回滚整个事务。语法格式如下:

复制代码
生成一个savepoint:
    SAVEPOINT the_savepoint_name
回滚事务到某个savepoint:
    ROLLBACK [WORK] TO [SAVEPOINT] the_savepoint_name
释放暂存点:
	RELEASE SAVEPOINT the_savepoint_name

2:实例

如下表:

java 复制代码
mysql> select * from words where id in (1,2);
+----+------+
| id | word |
+----+------+
|  1 | aaaa |
|  2 | aaab |
+----+------+
2 rows in set (0.00 sec)

接下来我们分别对id为1,2的word都拼加字符串hi,并分别生成保存点,最终回滚到id为1的修改保存点,并提交事务,因此最终只有id=1的word会追加hi成功,操作如下:

复制代码
mysql> start transaction with consistent snapshot;
Query OK, 0 rows affected (0.00 sec)

mysql> update words set word=concat(word,'hi') where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> savepoint sp_id_1; // 生成第一个暂存点
Query OK, 0 rows affected (0.00 sec)

mysql> update words set word=concat(word,'hi') where id=2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> savepoint sp_id_2; // 生成第二个暂存点
Query OK, 0 rows affected (0.00 sec)

mysql> rollback to savepoint sp_id_1; // 回滚到第一个暂存点,则第一个暂存点之后的所有修改都会被回滚,但第一个暂存点之前的修改回被保留
Query OK, 0 rows affected (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.06 sec)

mysql> select * from words where id in (1,2); 
+----+--------+
| id | word   |
+----+--------+
|  1 | aaaahi |
|  2 | aaab   |
+----+--------+
2 rows in set (0.00 sec)

可以看到最终只要id=1的word值成功追加了hi

写在后面

参考文章列表

MySQL 基础 ------------ SAVEPOINT 的应用

相关推荐
烟雨归来7 分钟前
RAC数据库OS进程消失,GV$SESSION长期残留KILLED僵尸会话处理
数据库·oracle
小龙报35 分钟前
【优选算法】1. 水果成蓝 2.找到字符串中所有字母的异位词
java·c语言·数据结构·数据库·c++·redis·算法
宇宙第一小趴菜1 小时前
六、Oracle 目录结构
数据库·oracle
IvorySQL1 小时前
PG 日报|修复高 IO 并发场景,解决预读机制耗尽本地缓冲区缺陷
数据库·人工智能·sql·postgresql·区块链
IT小盘1 小时前
08-FastAPI加MySQL实现AI对话记录持久化
android·mysql·fastapi
TiDB 社区干货传送门1 小时前
TiDB 8.5.7 发版|六项实用功能上线
数据库·mysql·tidb
在繁华处1 小时前
MySQL 学习笔记 01:从概念到约束,搭好库表骨架
数据库·oracle
三言老师2 小时前
CentOS7.9:Redis 数据持久化结构化实战教程
数据库·redis·缓存
鸽芷咕2 小时前
KingbaseES 优化器底层逻辑:等价变换如何改写 SQL,条件调度如何驱动运行时
数据库
Vect__2 小时前
MySQL 内连接和外连接:从匹配关系到业务查询
数据库·mysql