1.什么是事务
数据库中的事务是指对数据库执行一批操作,在同一个事务当中,这些操作最终要么全部执行成功,要么全部失败,不会存在部分成功的情况。
- 事务是一个原子操作。是一个最小执行单元。可以甶一个或多个
SQL
语句组成 - 在同一个事务当中,所有的
SQL
语句都成功执行时,整个事务成功,有一个SQL
语句执行失败,整个事务都执行失败。
举个例子:用户张三向用户李四转账500元。
如果在事务的支持下,上面最终只有2种结果:
-
有事务支持:张三转账成功,账户扣减500,李四账户增加500;张三和李四账号均没有发送变化。
-
无事务支持:可能出现张三账户扣减了500,此时系统挂了,导致李四账户没有入账500,而张三凭空少了500。
2.事务特性
- 原子性(Atomicity):事务是一个原子性质的操作单元,事务里面的对数据库的操作要么都执行,要么都不执行。
- 一致性(Consistency):在事务开始之前和完成之后,数据都必须保持一致状态,必须保证数据库的完整性。也就是说,数据必须符合数据库的规则。
- 隔离性(Isolation):一个事务的执行不能被其他事务干扰。即一个事务的内部操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
- 持久性(Durability):持久性也成为永久性,指一个事务一旦提交,它对数据库中数据的改变就应该是永久的。
3.MySQL事务操作
MySQL
中事务默认是隐式事务,执行insert、update、delete操作的时候,数据库自动开启事务、提交或回滚事务。是否开启隐式事务是由变量autocommit
控制的。所以事务分为隐式事务和显式事务。
3.1.隐式事务
事务自动开启、提交或回滚,比如insert、update、delete语句,事务的开启、提交或回滚由MySQL
内部自动控制的。
查看变量autocommit
是否开启了自动提交:
mysql> show variables like 'autocommit';
autocommit
为ON表示开启了自动提交。
3.2.显示事务
事务需要手动开启、提交或回滚,由开发者自己控制。
准备演示数据,创建数据库:
mysql> create table t_test (id int);
Query OK, 0 rows affected (0.01 sec)
mysql> select * from t_test;
Empty set (0.00 sec)
2种方式手动控制事务:
- 方式一:
示例一:提交事务操作
mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into t_test values(1);
Query OK, 1 row affected (0.00 sec)
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from t_test;
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
示例二:回滚事务操作
mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into t_test values(2);
Query OK, 1 row affected (0.00 sec)
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from t_test;
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
- 方式二:
把autocommit
还原回去:
mysql> set autocommit=1;
Query OK, 0 rows affected (0.00 sec)
示例一:提交事务操作
mysql> select * from t_test;
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into t_test values (2);
Query OK, 1 row affected (0.00 sec)
mysql> insert into t_test values (3);
Query OK, 1 row affected (0.00 sec)
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from t_test;
+------+
| i