MySQL事务
概念
- 是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或者撤销操作请求,即这一组数据库命令要么都执行,要么都不执行
- 是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元
- 使用于多用户同时操作的数据库系统的场景,如银行、保险公司及证券交易系统等等
- 通过事务的整体性以保证数据的一致性
事务的ACID特点
-
原子性(Atomicity)
- 事务是一个完整的操作,事务的各元素是不可分的
- 事务中的所有元素必须作为一个整体体积或者回滚
- 如果事务中的任何元素失败,则整个事务将失败
-
一致性
- 当事务完成时,数据必须处于一致状态
- 在事务开始前,数据库中存储的数据处于一致的状态
- 在正在进行的事务中,数据可能处于不一致的状态
- 当事务完成时,数据必须再次回到已知的一致状态
-
隔离性
- 对数据进行修改的所有并发事务是彼此隔离的,表明事务必须是独立的,它不应以任何形式依赖于或影响其他事务
- 修改数据的事务可在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据
-
持久性
- 指不管系统是否发生故障,事务处理的结果都是永久的
- 一旦事务被提交,事务的效果会被永久的保留在数据库中
MySQL事务默认是自动提交的,当SQL语句提交时,事务便自动提交
事务控制语句
- BEGIN或START TRANSACTION
- Begin 事务的开始,回滚也是回滚到begin 的状态
- COMMIT
- Commit 事务的结束
- ROLLBACK
- Rollback 回滚
- SAVEPOINT identifier
- Savepoint 设置存档点
- RELEASE SAVEPOINT identifier
- Release savepoint 删除存档点
- ROLLBACK TO identifier
- Rollback to 存档点名称 回滚到某个点
- SET TRANSACTION
- Set transaction 设置事务
手动对事务进行控制的方法
- 事务处理命令控制事务
- Begin 开始一个事务
- Commit 提交一个事务
- Rollback 回滚一个事务
- 使用set命令进行控制
- set autocommit=0:禁止自动提交
- set autocommit=1:开启自动提交
事务命令操作
对info表进行写入回滚操作
mysql> select * from info;
+----+----------+---------+
| id | name | address |
+----+----------+---------+
| 1 | zhangsan | nanjing |
+----+----------+---------+
1 row in set (0.00 sec)
mysql> begin
-> ;
Query OK, 0 rows affected (0.00 sec)
///插入记录///
mysql> insert into info value('2','lisi','jurong');
Query OK, 1 row affected (0.00 sec)
mysql> select * from info;
+----+----------+---------+
| id | name | address |
+----+----------+---------+
| 1 | zhangsan | nanjing |
| 2 | lisi | jurong |
+----+----------+---------+
2 rows in set (0.00 sec)
///回滚///
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from info;
+----+----------+---------+
| id | name | address |
+----+----------+---------+
| 1 | zhangsan | nanjing |
+----+----------+---------+
1 row in set (0.00 sec)
查看在开启自动提交功能开启前,添加记录,是否保存
mysql> set autocommit=0
-> ;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into info value('2','lisi','jurong');
Query OK, 1 row affected (0.00 sec)
mysql> set autocommit=1;
Query OK, 0 rows affected (0.00 sec)
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from info;
+----+----------+---------+
| id | name | address |
+----+----------+---------+
| 1 | zhangsan | nanjing |
| 2 | lisi | jurong |
+----+----------+---------+
2 rows in set (0.00 sec)
设置存档点
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into info value('3','wangwu','hefei');
Query OK, 1 row affected (0.00 sec)
mysql> savepoint a;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from info;
+----+----------+---------+
| id | name | address |
+----+----------+---------+
| 1 | zhangsan | nanjing |
| 2 | lisi | jurong |
| 3 | wangwu | hefei |
+----+----------+---------+
3 rows in set (0.00 sec)
mysql> insert into info value('4','zhaoliu','feixi');
Query OK, 1 row affected (0.00 sec)
mysql> savepoint b;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from info;
+----+----------+---------+
| id | name | address |
+----+----------+---------+
| 1 | zhangsan | nanjing |
| 2 | lisi | jurong |
| 3 | wangwu | hefei |
| 4 | zhaoliu | feixi |
+----+----------+---------+
4 rows in set (0.00 sec)
mysql> rollback to a;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from info;
+----+----------+---------+
| id | name | address |
+----+----------+---------+
| 1 | zhangsan | nanjing |
| 2 | lisi | jurong |
| 3 | wangwu | hefei |
+----+----------+---------+
3 rows in set (0.00 sec)
mysql> rollback to b;
ERROR 1305 (42000): SAVEPOINT b does not exist