MySQL事务的SavePoint简介及操作
短信预约 -IT技能 免费直播动态提醒
什么是SavePoint
SavePoint是数据库事务中的一个概念, 可以将整个事务切割为不同的小事务, 可以选择将状态回滚到某个小事务发生时的样子,
语法
定义保存点的语法如下:
SAVEPOINT 保存点的名称;
当我们想回滚到某个保存点时,可以使用下边的语句。
ROLLBACK [WORK] TO 保存点的名称
删除保存点
RELEASE SAVEPOINT 保存点名称;
重要操作
开启事务: begin
....DML语句....
设置保存点: savepoint 保存点名字
....DML语句....
设置保存点: savepoint 保存点名字2
....DML语句....
回滚保存点: rollback to 保存点名字2 (此时保存点2后面操作的状态都将回滚直保存点2时样子)
注意,回滚点无法随意跳转,例如上面,如果跳转到第一个保存点名字,就无法再到保存点名字2了,当事务整体提交、回滚时,保存点也随之释放。(一个事务中可以设置多少个保存点并无限制)
演示: 接下来用mysql演示一下,思路是向mysql insert三条数据, 每次insert设置一个保存点,在第三次insert后回滚到第一个保存点看下效果:
// 开始查询空表
mysql> select * from t_x;
Empty set
// 开启事务
mysql> begin;
Query OK, 0 rows affected (0.01 sec)
// 插入第一条数据
mysql> insert into t_x value(1, '1');
Query OK, 1 row affected (0.01 sec)
// 设置保存点
mysql> savepoint a1;
Query OK, 0 rows affected (0.01 sec)
// 此时查询一条数据
mysql> select * from t_x;
+----+------+
| id | name |
+----+------+
| 1 | 1 |
+----+------+
1 row in set (0.01 sec)
// 插入第二条数据
mysql> insert into t_x value(2, '2');
Query OK, 1 row affected (0.01 sec)
// 设置保存点2
mysql> savepoint a2;
Query OK, 0 rows affected (0.01 sec)
// 查询两条数据
mysql> select * from t_x;
+----+------+
| id | name |
+----+------+
| 1 | 1 |
| 2 | 2 |
+----+------+
2 rows in set (0.01 sec)
// 插入第三条数据
mysql> insert into t_x value(3, '3');
Query OK, 1 row affected (0.01 sec)
// 共三条
mysql> select * from t_x;
+----+------+
| id | name |
+----+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+----+------+
3 rows in set (0.01 sec)
// 回滚到第一个保存点
mysql> rollback to a1;
Query OK, 0 rows affected (0.01 sec)
// 此时查询,只有第一个保存点时的一条数据
mysql> select * from t_x;
+----+------+
| id | name |
+----+------+
| 1 | 1 |
+----+------+
1 row in set (0.00 sec)
// 尝试回滚到第二个保存点, 出错
mysql> rollback to a2;
1305 - SAVEPOINT a2 does not exist
mysql>
到此这篇关于MySQL事务的SavePoint简介及操作的文章就介绍到这了,更多相关MySQL事务的SavePoint内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341