-
多条语句作为一个整体进行操作, 称为
事务
-
数据库事务确保该范围内的所有的操作都可以全部成功, 或者全部失败.
-
如果事务失败, 那么执行效果和没有执行这些SQL一样, 不会对数据库有任何改动
-
数据库事务具有ACID四个特性:
- A: atomic, 原子性, 将sql作为原子工作单元执行, 要么全部执行, 要么不执行
- C: consistent, 一致性, 事务完成后所有状态都是一致的, A账户只要减去了100, B账户一定会加上100
- I: Isolation, 隔离性, 如果有多个事务并发执行, 每个事务作出的修改必须与其他事务隔离
- D: Duration, 持久性, 事务完成后, 对数据库的修改持久话存储
-
单条sql: 数据库自动将其作为一个事务执行, 这种事务被称为隐式事务
-
多条sql语句作为一个事务执行,
BEGIN
开启事务,COMMIT
提交事务, 显式事务 -
COMMIT
: 提交事务, 即试图把事务内的所有sql所做的修改永久保存, 如果COMMIT
失败了, 所有的sql都会失败 -
ROLLBACK
: 回滚事务, 主动让事务失败, 整个事务都会失败
隔离级别
- 如果涉及同一条记录的时候, 并发操作可能会发生问题, 引起数据不一致性问题
- 比如: 赃读, 不可重复读, 幻读等
- 四种隔离级别, 对应可能出现的数据不一致情况
- Isolation Level, Dirty Read, No Repeatable Read, Phantom Read
- Read Uncommitted, yes, yes, yes
- Read Committed, -, yes, yes
- Serializable, -, -, -
Read Uncommitted
- 隔离级别最低的事务
- 一个事务可以读到另一个事务更新后, 但未提交的数据.
- 脏读: 如果另一个事物回滚, 当前事务读到的就是脏数据.
# 客户端A
mysql> SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
Query OK, 0 rows affected (0.00 sec)
mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql> UPDATE teacher SET name='Bob' WHERE id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> ROLLBACK;
Query OK, 0 rows affected (0.00 sec)
# 客户端B
mysql> SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
Query OK, 0 rows affected (0.00 sec)
mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
# 此条数据为脏数据
mysql> SELECT * FROM teacher WHERE id=1;
+----+------+
| id | name |
+----+------+
| 1 | Bob |
+----+------+
1 row in set (0.00 sec)
mysql> SELECT * FROM teacher WHERE id=1;
+----+-------+
| id | name |
+----+-------+
| 1 | Alice |
+----+-------+
1 row in set (0.00 sec)
mysql> COMMIT;
Read Committed
- 在此级别的隔离程度下, 一个事务, 可能会遇到 不可重复读 问题 (Non Repeatable Read)
- 不可重复读: 在一个事务内, 多次读同一数据, 在这个事务还没有结束时, 如果另一个事务恰好修改了这个数据, 那么第一个事务中读到的数据就可能不一致
- 只能在第一次执行时, 成功复现
Repeatable Read
- 此隔离级别下, 可能出现幻读的情况
- 幻读: 在一个事务中, 第一次读取这个事务不存在, 当试图更新这条数据的时候, 能成功. 并再次查询能够查询到
Serializable
- 最高规格的隔离,所有的事务依次进行
- 不可能出现脏读, 不可重复读, 幻读
- 事务具有最高的安全性, 但是事务是串行的, 效率会大大下降
默认隔离级别
- 没有指定隔离级别, mysql会使用默认隔离级别
- MySQL中, 如果使用的是
InnoDB
, 默认的隔离级别是REPEATABLE READ