#事务及事务特性
#什么是事务
#事务特性:
- 原子性(atomicity)
- 一致性(consistency)
- 隔离性(isolation)
- 持久性(durability)
#事务并发引起的问题
- 脏读 (读取后其他事务回滚)
- 不可重复读 (update)
- 幻读 (insert)
#事务问题严重程度排名
- 脏读>不可重复读>幻读
#事务隔离级别
#SQL92标准中的隔离级别
- READ UNCOMMITTED:未提交读
- READ COMMITTED:已提交读
- REPEATABLE READ:可重复读
- SERIALIZABLE:可串行化
隔离级别 | 脏读 | 不可重复读 | 幻读 |
READ UNCOMMITTED:未提交读 | 可能 | 可能 | 可能 |
READ COMMITTED:已提交读 | - | 可能 | 可能 |
REPEATABLE READ:可重复读 | - | - | 可能 |
SERIALIZABLE:可串行化 | - | - | - |
#MySQL中的隔离级别
- READ UNCOMMITTED: 未提交读
- READ COMMITTED: 已提交读
- REPEATABLE READ: 可重复读
- SERIALIZABLE: 可串行化
隔离级别 | 脏读 | 不可重复读 | 幻读 |
READ UNCOMMITTED: 未提交读 | 可能 | 可能 | 可能 |
READ COMMITTED: 已提交读 | - | 可能 | 可能 |
REPEATABLE READ:可重复读 | - | - | - |
SERIALIZABLE:可串行化 | - | - | - |
#如何设置MySql的隔离级别
- SHOW VARIABLES LIKE 'transaction_isolation';
- SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;
#MySQL事务
- 开启事务: begin/start transaction
- 自动提交事务:autocommit ON(手动:OFF=0)
- 事务的基本语法
- 保存点(savepoint) rollback to savepoint xxx
- 隐式提交(注意事项):一些其他的语句(不是commit,不是rollback) 自动提交了。
>DDL语句:create、alter、drop(事务内不要执行,否则会造成隐式提交)
>再执行begin也会造成隐式提交
#MVCC与版本链 并发度很高,一致性读,快照读
- 版本链 存放在undo_log 日志中,后面一个指向前一个
#ReadView
- m_ids: 当前活跃的事务ID
- min_trx_id
- max_trx_id
- creator_trx_id:生成事务的ID
#READ COMMITTED: 已提交读
- ReadView多版本控制避免脏读
#REPEATABLE READ:可重复读
- ReadView多版本控制避免不可重复读,无法全部避免幻读。