it编程 > 数据库 > Mysql

MySQL怎么实现原子性的流程详解(以UPDATE为例)

33人参与 2025-08-18 Mysql

前言

首先,应该想到innodb存储引擎,因为它是mysql默认支持事务的引擎。myisam不支持事务,所以可能不适用。实现原子性关键在于undo log,undo log记录了sql执行之前的状态,以便回滚恢复数据。

另外,事务的提交和回滚机制也很重要。当用户执行一个事务时,所有的修改操作会先记录到undo log中,如果事务成功提交,这些修改才会被持久化到磁盘;如果事务回滚,系统会利用undo log将数据恢复到事务开始前的状态。

还需要考虑redo log,虽然redo log主要是保证持久性,但它在事务提交时也起到关键作用,确保即使系统崩溃,已提交的事务修改也不会丢失。但现在问题是原子性,所以可能更侧重于undo log和事务的回滚机制。

还有一方面,锁机制也可能有关联。比如,在事务执行期间,相关的数据会被加锁,防止其他事务干扰,这有助于保证事务的原子性,因为在一个事务未完成前,其他事务不能修改相同的数据,从而避免中间状态被看到。

undo的工作流程大致为,当事务开始时,innodb会生成一个undo log记录旧值。如果在事务中执行了insert、update或delete操作,这些操作的反向操作会被记录到undo log中。如果事务需要回滚,就利用这些undo log来撤销更改。

还有一个点是,原子性不仅包括回滚,还包括提交时的原子性。在提交时,所有修改必须一次性写入到redo log和binlog中,确保即使系统崩溃,也能通过日志恢复事务的状态。这里可能涉及到两阶段提交(2pc)协议,协调redo log和binlog的写入,保证两者的日志一致性,从而确保事务的原子性。

在此之前必须了解原子性的基本概念。

总结一下,mysql实现原子性的关键点包括:undo log记录修改前的数据状态,用于回滚;事务提交时的两阶段提交机制,确保日志的原子性写入;以及锁机制保证事务执行期间的隔离性,间接支持原子性。

mysql 通过 undo log(回滚日志)、事务提交机制 和 innodb 存储引擎的原子性设计 来实现事务的原子性,确保事务中的操作要么全部成功,要么全部回滚。下面章节是具体实现原理。

一、原子性的定义

原子性(atomicity)要求事务是一个不可分割的操作单元,事务中的操作要么全部成功提交,要么全部失败回滚,不会停留在中间状态。

二、实现原子性的核心技术

2.1. undo log(回滚日志)

2.2 事务提交与回滚机制

2.3. 崩溃恢复(crash recovery)

三、原子性的实现流程(以 update 为例)

1.事务开始:

start transaction;

2.执行 update 操作:

update users set balance = balance - 100 where id = 1;

innodb 将旧值 balance = 200 写入 undo log。

3.事务提交:

commit;

写入 redo log 并刷盘,标记事务完成。

4.事务回滚:

rollback;

四、关键设计与优化

  1. 两阶段提交(2pc)
  1. mvcc(多版本并发控制)
  1. 锁机制

五、原子性与其他 acid 属性的协作

六、验证原子性的示例

start transaction;
update accounts set balance = balance - 100 where user = 'a';
update accounts set balance = balance + 100 where user = 'b';
commit;

七、总结

mysql 通过以下机制实现原子性:

1.undo log:记录事务前的数据状态,支持回滚。

2.redo log 和两阶段提交:确保已提交事务的持久性和日志一致性。

3.崩溃恢复机制:通过日志回滚未完成事务或重放已提交事务。

4.锁与 mvcc:隔离事务操作,避免中间状态被其他事务读取。

这些机制共同保障了事务的原子性,使得 mysql 在高并发和数据一致性场景下表现可靠。

到此这篇关于mysql怎么实现原子性流程(以update为例)的文章就介绍到这了,更多相关mysql实现原子性内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

您想发表意见!!点此发布评论

推荐阅读

从基础到实战MySQL定时任务详解

08-18

MySQL的配置文件详解及实例代码

08-18

MySQL中查询和展示LONGBLOB类型数据的技巧总结

08-18

Mysql创建表以及数据库crud语句举例详细讲解

08-18

Mysql之DELETE操作对应的undo日志方式

08-18

MySQL Join使用之大表关联小表及小表关联大表

08-18

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论