多线程并发情况下mysql是如何保证原子性的?

多线程并发情况下mysql是如何保证原子性的

评论 (0)链接2012-11-07 

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 STATUS\G
来观察当前磁盘和日志的”差距”,在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。
参考: http://www.dewen.net.cn/q/196/

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2012-11-08
德问是一个专业的编程问答社区,请 登录注册 后再提交答案