MySQL 事务学习笔记
四种事务隔离级别(Isolation)《SQL:1992 标准》:
读未提交:READ UNCOMMITTED
很少使用
不能保证一致性
脏读(dirty read):使用到从未被确认的数据(例如:早期版本、回滚的数据)
读已提交:READ COMMITTED
每次查询都会设置和读取自己的新快照
仅支持基于行的 bin-log
update 优化:半一致性
不可重复读:不加锁的情况下,其他事务 UPDATE 或 DELETE 会对查询结果有影响
幻读(Phantom):加锁后,不锁定间隙,其他事务可以 INSERT
可重复读:REPEATABLE READ
InnoDB 的默认隔离级别
使用事务第一次读取时创建的快照
多版本技术
可串行化:SERIALIZABLE
最严格的级别,事务串行化,资源消耗最大。
MySQL 的一些具体情况:
可以设置全局的默认隔离级别;
可以单独设置会话的隔离级别;
InnoDB 实现与标准之间是有差异的。
事务的可靠性模型:四个特性(ACID)
Atomicity:原子性,一次事务中的操作要么全部成功,要么全部失败。
Consistency:一致性,跨表、跨行、跨事务,数据库始终保持一致状态。
Isolation:隔离性,可见性,保护事务不会互相干扰,包括 4 种隔离级别。
Durability:持久性,事务提交成功后,不会丢失数据。
undo log:撤销日志
可以保证事务的原子性
用处:事务回滚,一致性读、崩溃恢复。
记录事务回滚时所需的撤销操作。
一条 INSERT 语句,对应一条 DELETE 的 undo log。
每个 UPDATE 语句,对应一条相反 UPDATE 的 undo log。
redo log:重做日志
确保事务的持久性,防止事务提交后数据未刷新到磁盘就掉电或崩溃。
事务执行过程中写入 redo log,记录事务对数据页做了哪些修改。
提升性能:WAL(Write-Ahead Logging)技术,先写日志,再写磁盘。
日志文件:ib_logfile0,ib_logfile1
日志缓冲:innodb_log_buffer_size
强刷:fsync()
版权声明: 本文为 InfoQ 作者【风翱】的原创文章。
原文链接:【http://xie.infoq.cn/article/0e857818bc187ab5301fd91af】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论