写点什么

MySQL 事务学习笔记

用户头像
风翱
关注
发布于: 3 小时前

四种事务隔离级别(Isolation)《SQL:1992 标准》:

  • 读未提交:READ UNCOMMITTED

  1. 很少使用

  2. 不能保证一致性

  3. 脏读(dirty read):使用到从未被确认的数据(例如:早期版本、回滚的数据)

  • 读已提交:READ COMMITTED

  1. 每次查询都会设置和读取自己的新快照

  2. 仅支持基于行的 bin-log

  3. update 优化:半一致性

  4. 不可重复读:不加锁的情况下,其他事务 UPDATE 或 DELETE 会对查询结果有影响

  5. 幻读(Phantom):加锁后,不锁定间隙,其他事务可以 INSERT

  • 可重复读:REPEATABLE READ

  1. InnoDB 的默认隔离级别

  2. 使用事务第一次读取时创建的快照

  3. 多版本技术

  • 可串行化: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()


发布于: 3 小时前阅读数: 3
用户头像

风翱

关注

还未添加个人签名 2017.11.24 加入

勇于尝试,持续成长

评论

发布
暂无评论
MySQL事务学习笔记