mysql-innodb-事务
写在最前
这是读书笔记,Mysql,innodb系列一共3篇。
ACID
- A:原子性,要么成功,要么失败
- C:一致性,事务将数据库从一种状态转换为另一种稳定状态,不违反约束条件
- I:隔离性,多个事务互不影响
- D:持久性
事务的隔离级别
| 隔离级别 | 说明 |
| READ UNCOMMITTED | 未提交读,会造成脏读,违反持久性D |
| READ COMMITTED | 读已提交数据, 会造成幻读 违反一致性C |
| REPEATABLE READ | 可重复读,默认隔离级别 |
| SERIALIZABLE | 不会使用mysql的mvcc机制,而是在每一个select请求下获得读锁,在每一个update操作下尝试获得写锁 |
SELECT@@global.tx_isolation查看全局事务隔离级别
事务的实现
Force Log at Commit机制
- 当事务提交时,必须先将该事务的所有日志写入到日志文件进行持久化,之后进行COMMIT操作完成。
- 日志写入日志文件时,日志缓冲先写入文件系统缓存,为了确保写入磁盘,需要调用一次fsync操作。
- 由于fsync的效率取决于磁盘的性能,因此磁盘的性能决定了事务提交的性能,也就是数据库的性能。
3种日志文件
redolog
概念
log buffer刷新策略
| innodb_flush_log_at_trx_commit值 | 说明 |
| 0 | 提交时,不写入日志文件 |
| 1 | 默认值,提交时调用一次fsync操作 |
| 2 | 提交时写日志文件,不进行fsync操作 |
log buffer刷新到磁盘的规则
- 事务提交时
- log buffer已经有一半空间被使用
- log checkpoint时
innodb恢复时如何使用redolog
undolog
基本概念
- 存储在undo段中,位于共享表空间,逻辑日志
- 支持mvcc,支持回滚
- undolog 会生产redo log
格式
| 类型 | 说明 |
| insert undo log | insert产生,事务本身可见,其他事务不可见,commit后直接删除 |
| update undo log |
delete,update产生,其他事务可见,commit后放入列表中,供purge操作
比insert undo log大
|
commit后
binlog
purge
delay=((length(history_list)- innodb_max_purge_lag)*10)-5
group commit
综述:5.7版本innodb开启binlog的commit过程
