首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL事务详解

MySQL事务详解

原创
作者头像
JDK7.0
修改2025-02-08 15:35:11
修改2025-02-08 15:35:11
1860
举报

事务(Transaction)是数据库管理系统(DBMS)中的一个重要概念,它是一系列操作的集合,这些操作要么全部执行成功,要么全部失败。

ACID 特性

  • 原子性(Atomicity):事务是一个不可分割的单位,因此在一个事务里的所有操作要么全部生效,要么全部不生效。
  • 一致性(Consistency):也可以理解为是预期状态的正确性,即从一个正确的状态到另一个正确的状态,这里的状态往往是由业务来定义的。比如转账中的一个扣钱一个加钱,是我们规定的一个数据流转,那么执行前的账户余额和转账后的账户余额就得满足加减特性,这就是所谓的业务正确。
  • 隔离性(Isolation):事务并发执行时,各个事务之间相互影响的程度。
  • 持久化(Durability):通过日志等手段,只要我们的事务提交成功了,那么就意味着这次的数据操作是成功的。即使下次重启了程序,也不会丢失此处的操作结果。

隔离级别

  • 未提交读: 即所谓的脏读,事务读取的数据可能是另一个事务已修改但还没提交的,这部分数据有可能产生回滚。导致后续的操作依赖了无效的数据。
  • 已提交读: 如果想防止脏读,就需要等待其他事务提交后再进行读取操作。
  • 可重复读: 已提交读的隔离级别考虑到了数据回滚的无效性,却无法阻止事务的多次提交。比如事务 A 不断的对表进行修改提交,那么事务 B 就会在不同的时间点读取到不同的数据。为了让事务 B 在执行期间读取的数据都是一致的,就有了可重复读的隔离级别,即事务 B 在执行期间,其他事务不得进行修改操作。
  • 可串行化: 上面的可重复读隔离级别保证了事务执行期间读取的一致性。然而这里并不包括插入、删除操作。即会出现读多读少数据的情况,这种现象叫做幻读。为了解决幻读,只得进行串行化执行事务,才能互不影响。而此时的事务并发性是最低的。

事务隔离级别

脏读

不可重复读

幻读

读未提交(read-uncommitted)

读未提交(read-uncommitted)

可重复读(repeatable-read)

是(对InnoDB不可能)

序列化/串行化(serializable)

日志类型

MySQL Innodb中跟数据持久性、一致性有关的日志,有以下几种:

  • Bin Log:是mysql服务层产生的日志,常用来进行数据恢复、数据库复制,常见的mysql主从架构,就是采用slave同步master的binlog实现的
  • Redo Log:记录了数据操作在物理层面的修改,mysql中使用了大量缓存,修改操作时会直接修改内存,而不是立刻修改磁盘,事务进行中时会不断的产生redo log,在事务提交时进行一次flush操作,保存到磁盘中。当数据库或主机失效重启时,会根据redo log进行数据的恢复,如果redo log中有事务提交,则进行事务提交修改数据。
  • Undo Log: 除了记录redo log外,当进行数据修改时还会记录undo log。undo log用于数据的撤回操作,它记录了修改的反向操作,比如,插入对应删除,修改对应修改为原来的数据,通过undo log可以实现事务回滚,并且可以根据undo log回溯到某个特定的版本的数据,实现MVCC。

MVCC(多版本并发控制)

如何保证一个事务中前后两次读取数据结果一致,实现事务隔离。

  1. 读取事务之前加锁,防止其他事务修改数据 这种方法被成为 LBC ( Lock Based Concurrency Control)。
  2. 生成一个数据请求时间点的一致性数据快照 (Snapshot),并用这个快照来提供一定级别(语句级或事 务级)的一致性读取 MVCC (Multi Version Concurrency Control)。

MVCC代表多版本并发控制。与MVCC相对的,是基于锁的并发控制

MVCC最大的优势:读不加锁,读写不冲突。在读多写少的OLTP应用中,读写不冲突是非常重要的,极大的增加了系统的并发性能

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ACID 特性
  • 隔离级别
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档