MySQL事务和隔离机制
MySQL事务和隔离机制
1. 事务
由一组相关的dml语句组成,该组dml语句要么全部成功,要么全部失败
1.1 事务作用
- 用于保证数据的一致性
1.2 事务和锁
- 当执行事务操作时,MySQL会在表上加锁,防止其他用户更改表中数据
1.3 事务操作
- 开始一个事务:
START TRANSACTION - 设置保存点:
SAVEPOINT [保存点名] - 回退事务到某个保存点:
ROLLBACK TO [保存点名] - 回退全部事务:
ROLLBACK - 提交事务:
COMMIT(提交后,所有操作不可回退)
注: 事务commit后,会自动删除事务中的所有保存点,从当前保存点回退到上一个保存点,当前保存点会被自动删除
1.4 事务注意事项
- 默认情况下,dml操作是自动提交的,不能回滚
- 开始一个事务,但没有创建保存点,执行rollback,默认回退到事务开始的状态
- 可以在事务中创建多个保存点
- 在事务没有提交前,可以选择回退到哪个检查点
- MySQL事务机制需要InnoDB的存储引擎才可以使用
- 开始事务 START TRANSACTION, SET AUTOCOMMIT = off
1.5 MySQL事务ACID
- 原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都执行,要么都不执行 - 一致性(Consistency)
事务必须使数据库从一个一致性状态变换到另一个一致性状态 - 隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,事务为每一个用户开启的事务,不能被其他事物的操作数据干扰,并发多个事务之间要相互隔离 - 持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
2. 隔离机制
多个连接开启各自事务操作数据库中数据时,数据库系统要负责隔离操作,以保证各个连接在获取数据时的准确性
2.1 四种隔离级别
脏读: 一个事务读取另一个事务未提交的改变(UPDATE,INSERT,DELETE)
不可重复读: 一个事务中进行多次查询,因为其他提交事务的修改或删除操作,导致每次查询到的数据都不一样,此时发生不可重复读
幻读: 一个事务中进行多次查询,因为其他提交事务的插入操作,每次查询到的数据不同,此时发生幻读
MySQL隔离级别定义了事务与事务之间的隔离程度
| MySQL隔离级别(4种) | 脏读 | 不可重复读 | 幻读 | 加锁读 |
|---|---|---|---|---|
| 读未提交(Read uncommitted) | ✓ | ✓ | ✓ | 不加锁 |
| 读已提交(Read committed) | ✗ | ✓ | ✓ | 不加锁 |
| 可重复读(Repeatable read) | ✗ | ✗ | ✗ | 不加锁 |
| 可串行化(Serializable) | ✗ | ✗ | ✗ | 加锁 |
2.2 设置隔离级别的方法
- 查看会话隔离级别
SELECT @@tx_isolation - 查看系统当前隔离级别
SELECT @@global.tx_isolation - 设置当前会话隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL [隔离级别] - 设置系统当前隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL [隔离级别]
注: MySQL默认的隔离级别是REPEATABLE READ,没有特殊要求,一般不修改
全局修改,修改my.ini配置文件,在最后加上
[mysqld]
transaction-isolation = REPEATABLE-READ
//可选参数有:READ-UNCOMMITTED,READ-COMMITTED,REPEATABLE-READ,SERIALIZABLE

浙公网安备 33010602011771号