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

发布于 2016-11-10 15:17:25 字数 29 浏览 1251 评论 1

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

甜柠檬 2016-12-20 03:55:45

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。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文