MySQL之事务
MySQL 刘宇帅 4年前 阅读量: 1163
事务就是一组 SQL 语句,当数据库执行这组 SQL 的时候要不全部执行这组 SQL,否则只要有一条 SQL 无法执行整组 SQL 都无法执行。
并不是任何执行的 SQL 序列都是事务,事务有以下四个特性:
原子性(atomicity)
一个事务是一个不可分割的最小工作单元,一个事务中的所有操作要么全部执行,要么全部回滚不执行,事务不可能只执行一部分操作。
一致性(consistency)
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。比如银行账户A转账给B时,无论事务如果执行最后结果A、B的总金额不会变。
隔离性(isolation)
数据库中多个事务并发执行时是相互独立的,一个事务不会影响另外一个事务的执行,事务与事务的隔离是有不同级别的,不同级别情况下事务之间的影响不一样。
持久性(durability)
事务一旦提交则其所做的修改就会永久保存到数据库中,即使数据库崩溃,事务修改的数据也不会丢失。
MySQL 提供了两个支持事务的存储引擎:InnoDB 和 NDB Cluster。MySQL 默认使用自动提交的模式,也就是说如果不显示开启一个事务那么所有的查询都会被当做一个事务执行。
查看 MySQL 是否开启自动提交
mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.00 sec)
autocommit 值为 ON 表示开启了自动提交。关闭自动提交:
mysql> set autocommit=off;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | OFF |
+---------------+-------+
1 row in set (0.00 sec)
我们执行更新操作,把洛基修改为女性
mysql> select * from students where id=1;
+----+------+--------+-----+------+---------------------+---------------------+
| id | no | name | sex | age | created_at | updated_at |
+----+------+--------+-----+------+---------------------+---------------------+
| 1 | 0001 | 洛基 | 2 | 25 | 2019-12-20 20:00:00 | 2019-12-20 20:00:00 |
+----+------+--------+-----+------+---------------------+---------------------+
1 row in set (0.00 sec)
mysql> update students set sex=1 where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
我们打开一个新的连接到 mysql 并查询 洛基的性别,如下洛基性别并未改变
mysql> select * from students where id=1;
+----+------+--------+-----+------+---------------------+---------------------+
| id | no | name | sex | age | created_at | updated_at |
+----+------+--------+-----+------+---------------------+---------------------+
| 1 | 0001 | 洛基 | 2 | 25 | 2019-12-20 20:00:00 | 2019-12-20 20:00:00 |
+----+------+--------+-----+------+---------------------+---------------------+
1 row in set (0.00 sec)
我们在第一个连接里执行 commit
mysql> commit;
Query OK, 0 rows affected (0.01 sec)
然后再第二个连接里检查洛基的性别,如下洛基已经是 女 的了。
mysql> select * from students where id=1;
+----+------+--------+-----+------+---------------------+---------------------+
| id | no | name | sex | age | created_at | updated_at |
+----+------+--------+-----+------+---------------------+---------------------+
| 1 | 0001 | 洛基 | 1 | 25 | 2019-12-20 20:00:00 | 2019-12-20 01:16:41 |
+----+------+--------+-----+------+---------------------+---------------------+
1 row in set (0.00 sec)