标签:数据库事务 savepoint rollback commit
由MySQL AB公司开发,是最流行的开放源码SQL数据库管理系统,主要特点:
1、是一种数据库管理系统
2、是一种关联数据库管理系统
3、是一种开放源码软件,且有大量可用的共享MySQL软件
4、MySQL数据库服务器具有快速、可靠和易于使用的特点
5、MySQL服务器工作在客户端/服务器模式下,或嵌入式系统中
InnoDB存储引擎将InnoDB表保存在一个表空间内,该表空间可由数个文件创建。这样,表的大小就能超过单独文件的最大容量。表空间可包括原始磁盘分区,从而使得很大的表成为可能。表空间的最大容量为64TB。
2.1.多事务同时执行:
彼此之间互不影响的方式进行并行;事务之间交互,通过数据集。
START TRANSACTION: 启动事务命令 数据库只有启动了事务才允许回滚撤销等操作。
且数据的engine引擎必须是innodb,才支持事务
ROLLBACK : 回滚事务,mysql只要没有提交开启了事务都可以进行回滚操作。
COMMIT: 事务提交,事务提交后无法进行回滚操作。
若未明确启动事务:autocommit 能实现自动提交,每一个操作都直接提交;
建议:明确使用事务,否则所有操作都被当成一个事务来处理,并关闭自动提交。
否则浪费mysql很多IO操作,每写一条语句都执行提交至持久性存储,很浪费资源
2.2.事务的特性:
2.2.1.Atomicity: 原子性
事务所引起的数据库操作,要不都完成,要么都不执行;
2.2.2.Consistency: 一致性
2.2.3.Isolation: 隔离性
事务调度: 事务之间影响最小
MVCC: 多版本并发控制
2.2.4.Durability: 持久性
一旦事务成功完成,系统必须保证任何故障都不会引起事务表示出不一致性;
1、事务提交之前就已经写出数据至持久性存储;
2、结合事务日志完成;
事务日志:顺序IO
数据文件:随机IO
2.3.事务的状态:
活动的: active
部分提交的: 最后一条语句执行后
失败的:
终止的:
提交的:
状态间的转换过程
事务并发执行的优势:1、提高吞吐量和资源利用率 2、减少等待时间
事务调度: 1、可恢复调度 2、无极联调度
3.1. 设置自动提交开关
mysql> SELECT @@AUTOCOMMIT; #自动提交的状态1为开启,0为关闭;
+--------------+
| @@AUTOCOMMIT |
+--------------+
| 1 |
+--------------+
1 row in set (0.00 sec)
mysql> SET AUTOCOMMIT=0; #设定自动提交关闭
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @@AUTOCOMMIT; #查询自动提交的状态1为开启,0为关闭;
+--------------+
| @@AUTOCOMMIT |
+--------------+
| 0 |
+--------------+
1 row in set (0.00 sec)
3.2. 回滚事务
mysql> SET AUTOCOMMIT=0; #设定自动提交关闭
Query OK, 0 rows affected (0.00 sec)
mysql> commit #将之前的事务全部提交
mysql> DELETE FROM student WHERE Name LIKE ‘Li%‘; #删除Name字段包含Li的行
Query OK, 1 row affected (0.03 sec)
mysql> SELECT * FROM student; #Li哪行已经被删除
+-----+------------+-----+-----+
| SID | Name | Age | CID |
+-----+------------+-----+-----+
| 2 | Cheng Long | 0 | 2 |
| 3 | Yang Guo | 0 | 3 |
| 4 | Guo Jing | 0 | 4 |
+-----+------------+-----+-----+
3 rows in set (0.00 sec)
mysql> ROLLBACK; #回滚事务,自动提交关闭后,默认就开启了事务,可以实现回滚等操作
Query OK, 0 rows affected (0.01 sec)
mysql> SELECT * FROM student; #删除的行恢复了
+-----+------------+-----+-----+
| SID | Name | Age | CID |
+-----+------------+-----+-----+
| 1 | Li Lianjie | 0 | 1 |
| 2 | Cheng Long | 0 | 2 |
| 3 | Yang Guo | 0 | 3 |
| 4 | Guo Jing | 0 | 4 |
+-----+------------+-----+-----+
4 rows in set (0.00 sec)
3.2. 保存点:恢复到所定义的那个保存点SAVEPOINT,保存点名称不能为纯数字。
保存点:SAVEPOINT savepoint_name; 保存以上操作为该保存点名称
回滚保存点:ROLLBACK TO savepoint_name; 回滚到该保存点之前的状态
3.2. 1.保存点实验一
mysql> START TRANSACTION; #启动事务
Query OK, 0 rows affected (0.00 sec)
mysql> SAVEPOINT a; #该保存点student表数据都存在
Query OK, 0 rows affected (0.00 sec)
mysql> select * FROM student;
+-----+------------+-----+-----+
| SID | Name | Age | CID |
+-----+------------+-----+-----+
| 1 | Li Lianjie | 0 | 1 |
| 2 | Cheng Long | 0 | 2 |
| 3 | Yang Guo | 26 | 3 |
| 4 | Guo Jing | 53 | 4 |
+-----+------------+-----+-----+
4 rows in set (0.00 sec)
mysql> DELETE FROM student WHERE SID=4; #删除student表的SID为4的行
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM student;
+-----+------------+-----+-----+
| SID | Name | Age | CID |
+-----+------------+-----+-----+
| 1 | Li Lianjie | 0 | 1 |
| 2 | Cheng Long | 0 | 2 |
| 3 | Yang Guo | 26 | 3 |
+-----+------------+-----+-----+
3 rows in set (0.00 sec)
mysql> SAVEPOINT b; #该保存点student表数据的SID为4的行不存在了
Query OK, 0 rows affected (0.00 sec)
mysql> DELETE FROM student WHERE SID=3;
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM student;
+-----+------------+-----+-----+
| SID | Name | Age | CID |
+-----+------------+-----+-----+
| 1 | Li Lianjie | 0 | 1 |
| 2 | Cheng Long | 0 | 2 |
+-----+------------+-----+-----+
2 rows in set (0.00 sec)
mysql> SAVEPOINT c; #该保存点student表的SID为3和4的行都不存在
Query OK, 0 rows affected (0.00 sec)
mysql> ROLLBACK TO b; #回滚至保存点b,即student表,SID为4的行不存在的行
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM student;
+-----+------------+-----+-----+
| SID | Name | Age | CID |
+-----+------------+-----+-----+
| 1 | Li Lianjie | 0 | 1 |
| 2 | Cheng Long | 0 | 2 |
| 3 | Yang Guo | 26 | 3 |
+-----+------------+-----+-----+
3 rows in set (0.00 sec)
mysql> ROLLBACK TO a; #即所有数据都存在的那个点
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM student;
+-----+------------+-----+-----+
| SID | Name | Age | CID |
+-----+------------+-----+-----+
| 1 | Li Lianjie | 0 | 1 |
| 2 | Cheng Long | 0 | 2 |
| 3 | Yang Guo | 26 | 3 |
| 4 | Guo Jing | 53 | 4 |
+-----+------------+-----+-----+
4 rows in set (0.00 sec)
3.2.2.保存点实验二
3.2.2.1.设置a2、a4、a6、a8四个保存点
mysql> select * from tutors;
+-----+--------------+--------+------+
| TID | Tname | Gender | Age |
+-----+--------------+--------+------+
| 1 | HongQigong | M | 93 |
| 2 | HuangYaoshi | M | 63 |
| 3 | Miejueshitai | F | 72 |
| 4 | OuYangfeng | M | 76 |
| 5 | YiDeng | M | 90 |
| 6 | YuCanghai | M | 56 |
| 7 | Jinlunfawang | M | 67 |
| 8 | HuYidao | M | 42 |
| 9 | NingZhongze | F | 49 |
+-----+--------------+--------+------+
9 rows in set (0.00 sec)
mysql> delete from tutors where TID = 2 ;
Query OK, 1 row affected (0.00 sec)
mysql> savepoint a2 ;
Query OK, 0 rows affected (0.00 sec)
mysql> delete from tutors where TID = 4 ;
Query OK, 1 row affected (0.00 sec)
mysql> savepoint a4;
Query OK, 0 rows affected (0.00 sec)
mysql> delete from tutors where TID = 6 ;
Query OK, 1 row affected (0.00 sec)
mysql> savepoint a6;
Query OK, 0 rows affected (0.00 sec)
mysql> delete from tutors where TID = 8 ;
Query OK, 1 row affected (0.00 sec)
mysql> savepoint a8;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from tutors;
+-----+--------------+--------+------+
| TID | Tname | Gender | Age |
+-----+--------------+--------+------+
| 1 | HongQigong | M | 93 |
| 3 | Miejueshitai | F | 72 |
| 5 | YiDeng | M | 90 |
| 7 | Jinlunfawang | M | 67 |
| 9 | NingZhongze | F | 49 |
+-----+--------------+--------+------+
5 rows in set (0.00 sec)
3.2.2.回滚到a4保存点OK
mysql> rollback to a4;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from tutors;
+-----+--------------+--------+------+
| TID | Tname | Gender | Age |
+-----+--------------+--------+------+
| 1 | HongQigong | M | 93 |
| 3 | Miejueshitai | F | 72 |
| 5 | YiDeng | M | 90 |
| 6 | YuCanghai | M | 56 |
| 7 | Jinlunfawang | M | 67 |
| 8 | HuYidao | M | 42 |
| 9 | NingZhongze | F | 49 |
+-----+--------------+--------+------+
7 rows in set (0.00 sec)
3.2.3.再回滚到a6保存点失败,该保存点已不存在
mysql> rollback to a6;
ERROR 1305 (42000): SAVEPOINT a6 does not exist
3.2.4.但再回滚到a2保存点OK
mysql> rollback to a2;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from tutors;
+-----+--------------+--------+------+
| TID | Tname | Gender | Age |
+-----+--------------+--------+------+
| 1 | HongQigong | M | 93 |
| 3 | Miejueshitai | F | 72 |
| 4 | OuYangfeng | M | 76 |
| 5 | YiDeng | M | 90 |
| 6 | YuCanghai | M | 56 |
| 7 | Jinlunfawang | M | 67 |
| 8 | HuYidao | M | 42 |
| 9 | NingZhongze | F | 49 |
+-----+--------------+--------+------+
8 rows in set (0.00 sec)
3.2.5.但再回滚到最原始保存点OK
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from tutors;
+-----+--------------+--------+------+
| TID | Tname | Gender | Age |
+-----+--------------+--------+------+
| 1 | HongQigong | M | 93 |
| 2 | HuangYaoshi | M | 63 |
| 3 | Miejueshitai | F | 72 |
| 4 | OuYangfeng | M | 76 |
| 5 | YiDeng | M | 90 |
| 6 | YuCanghai | M | 56 |
| 7 | Jinlunfawang | M | 67 |
| 8 | HuYidao | M | 42 |
| 9 | NingZhongze | F | 49 |
+-----+--------------+--------+------+
9 rows in set (0.00 sec)
3.2.6.回滚到最原始保存点后,但再回滚a8、a2R失败
mysql> rollback to a8;
ERROR 1305 (42000): SAVEPOINT a8 does not exist
mysql> rollback to a2;
ERROR 1305 (42000): SAVEPOINT a2 does not exist
---end---9-
本文出自 “风过无痕” 博客,请务必保留此出处http://wangfx.blog.51cto.com/1697877/1934054
标签:数据库事务 savepoint rollback commit
原文地址:http://wangfx.blog.51cto.com/1697877/1934054