返回

事务隔离与并发控制:MySQL读取的记录和我想象的不一致

后端

前言

在实际的数据库应用中,经常会遇到多个事务同时操作数据库的情况。为了确保数据的完整性和一致性,数据库管理系统(DBMS)提供了事务隔离级别和并发控制机制。事务隔离级别定义了不同事务之间的数据可见性,而并发控制机制则确保了不同事务对数据的并发访问不会产生冲突。

事务隔离级别

MySQL支持四种事务隔离级别:

  • 读未提交(READ UNCOMMITTED) :这种隔离级别允许一个事务读取另一个事务尚未提交的数据。这意味着一个事务可以读取另一个事务正在修改的数据,甚至可以读取另一个事务已经回滚的数据。读未提交隔离级别是最低的事务隔离级别,它提供了最差的一致性保证,但它也具有最高的并发性。
  • 读已提交(READ COMMITTED) :这种隔离级别允许一个事务读取另一个事务已经提交的数据。这意味着一个事务不会读取另一个事务正在修改的数据,也不会读取另一个事务已经回滚的数据。读已提交隔离级别比读未提交隔离级别提供了更好的数据一致性,但它也降低了并发性。
  • 可重复读(REPEATABLE READ) :这种隔离级别允许一个事务读取它在事务开始时已经存在的数据,以及在事务期间提交的数据。这意味着一个事务不会读取另一个事务正在修改的数据,也不会读取另一个事务已经回滚的数据。可重复读隔离级别比读已提交隔离级别提供了更好的数据一致性,但它也降低了并发性。
  • 串行化(SERIALIZABLE) :这种隔离级别确保了所有的事务都是串行执行的。这意味着一个事务只能在另一个事务提交之后开始执行。串行化隔离级别提供了最高的数据一致性,但它也具有最低的并发性。

并发控制

MySQL使用多种并发控制机制来确保不同事务对数据的并发访问不会产生冲突。这些并发控制机制包括:

  • 行锁 :行锁是在单个行上施加的锁。当一个事务对一行数据进行修改时,它会获得该行的行锁。其他事务不能在该行锁释放之前对该行数据进行修改。
  • 间隙锁 :间隙锁是在两个相邻的行之间施加的锁。当一个事务对一个范围内的行数据进行查询时,它会获得该范围内的间隙锁。其他事务不能在该间隙锁释放之前对该范围内的行数据进行插入或删除操作。
  • 读锁 :读锁是在一行数据上施加的共享锁。当一个事务对一行数据进行读取时,它会获得该行的读锁。其他事务也可以获得该行的读锁,但不能获得该行的写锁。
  • 写锁 :写锁是在一行数据上施加的独占锁。当一个事务对一行数据进行修改时,它会获得该行的写锁。其他事务不能在该写锁释放之前对该行数据进行读取或修改。

事务隔离级别与MVCC

MySQL使用多版本并发控制(MVCC)机制来实现不同的事务隔离级别。MVCC机制维护了数据的多