多线程并发情况下mysql是如何保证原子性的
InnoDB引擎事务完全符合事务的ACID特性(Automicity 原子性,Consistency一致性,Isolation 隔离性, Durability 持久性)
事务隔离性通过锁来实现,原子性、一致性、持久性通过数据库的redo和undo来完成。
innodb通过redo日志文件和innodb log buffer来实现redo。
当事务开始时,innodb会记录该事务的一个LSN(Log Sequence Number,日志序列号),当执行事务时,会往innodb log buffer写入事务日志,当事务提交时,必须将innodb存储引擎的日志缓存写入磁盘(默认的实现,通过 innodb_flush_log_at_trx_commit=1) 这意味这磁盘上的页和内存缓冲池中的页是不同步的,可以通过 show ENGINE INNODB STATUSG 来观察当前磁盘和日志的”差距”,在LOG字段。Log sequencenumber表示当前的LSN,Log flushed up to表示刷新到重做日志文件的LSN,Last checkpoint at 表示刷新到磁盘的LSN。
undo和redo相反,redo是重做,undo是撤销。使用rollback语句请求回滚就可以利用undo信息将数据回滚到修改之前的样子。redo存放在redo日志里面,undo存放在数据库内部的一个特殊段(undo segment),undo段位于共享表空间里。undo是逻辑操作,它实际上是做与之前相反的工作,之前是insert,它就delete对于每个update,undo都会执行一个相反的update。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
暂无简介
文章 0 评论 0
接受
发布评论
评论(1)
InnoDB引擎事务完全符合事务的ACID特性(Automicity 原子性,Consistency一致性,Isolation 隔离性, Durability 持久性)
事务隔离性通过锁来实现,原子性、一致性、持久性通过数据库的redo和undo来完成。
innodb通过redo日志文件和innodb log buffer来实现redo。
当事务开始时,innodb会记录该事务的一个LSN(Log Sequence Number,日志序列号),当执行事务时,会往innodb log buffer写入事务日志,当事务提交时,必须将innodb存储引擎的日志缓存写入磁盘(默认的实现,通过 innodb_flush_log_at_trx_commit=1) 这意味这磁盘上的页和内存缓冲池中的页是不同步的,可以通过 show ENGINE INNODB STATUSG 来观察当前磁盘和日志的”差距”,在LOG字段。Log sequence
number表示当前的LSN,Log flushed up to表示刷新到重做日志文件的LSN,Last checkpoint at 表示刷新到磁盘的LSN。
undo和redo相反,redo是重做,undo是撤销。使用rollback语句请求回滚就可以利用undo信息将数据回滚到修改之前的样子。redo存放在redo日志里面,undo存放在数据库内部的一个特殊段(undo segment),undo段位于
共享表空间里。undo是逻辑操作,它实际上是做与之前相反的工作,之前是insert,它就delete对于每个update,undo都会执行一个相反的update。