跳至主要內容

MySQL事务

知识库数据库MySQLMySQL大约 2 分钟

数据库事务具有 ACID 四大特性。

  • 原子性(atomicity) :事务最小工作单元,要么全成功,要么全失败 。
  • 一致性(consistency): 事务开始和结束后,数据库的完整性不会被破坏 。
  • 隔离性(isolation) :不同事务之间互不影响,四种隔离级别为 RU(读未提交)、RC(读已提交)、RR(可重复读)、SERIALIZABLE (串行化)。
  • 持久性(durability) :事务提交后,对数据的修改是永久性的,即使系统故障也不会丢失 。

隔离级别

  • 未提交读(READ UNCOMMITTED/RU)

    脏读:一个事务读取到另一个事务未提交的数据,算是十分不安全的一种隔离级别

  • 已提交读(READ COMMITTED/RC)

    不可重复读:一个事务因读取到另一个事务已提交的 update。导致对同一条记录读取两次以上的结果不一致。

  • 可重复读(REPEATABLE READ/RR)

    幻读:一个事务因读取到另一个事务已提交的 insert 数据或者 delete 数据。导致对同一张表读取两次以上的结果不一致。

  • 串行化(SERIALIZABLE)

    以上 3 种隔离级别都允许对同一条记录进行读-读、读-写、写-读的并发操作,如果我们不允许读-写、写-读的并发操作,可以使用 SERIALIZABLE 隔离级别,

-- 查看当前事务级别:
SELECT @@tx_isolation;
--设置read uncommitted级别:
set session transaction isolation level read uncommitted;
-- 设置read committed级别:
set session transaction isolation level read committed;
-- 设置repeatable read级别:
set session transaction isolation level repeatable read;
-- 设置serializable级别:
set session transaction isolation level serializable;

MVCC(多版本的并发控制)

MVCC 最大的好处:读不加锁,读写不冲突。

多版本并发控制仅仅是一种技术概念,并没有统一的实现标准, 其核心理念就是数据快照,不同的事务访问不同版本的数据快照,从而实现不同的事务隔离级别。

  • InnoDB 的 MVCC

    MVCC 在 MySQL 中的实现依赖的是 undo log 与 read view 。
  • INSERT

    InnoDB 为新插入的每一行保存当前事务编号作为行版本号。
  • DELETE

    InnoDB 为删除的每一行保存当前事务编号作为行删除标识。
  • UPDATE

    InnoDB 为插入一行新记录,保存当前事务编号作为行版本号,同时保存当前事务编号到原来的行作为行删除标识。