MySQL事务相关(面试高频)

48 阅读3分钟

事务相关

1. 事务4大特性:ACID

  1. 原子性(Atomicity)

事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

  1. 一致性(Consistency)

事务前后数据的完整性必须保持一致,包括数据完整性、约束完整性、引用完整性。

image.png

  1. 隔离性(Isolation)

多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务干扰,多个并发事务之间的数据要相互隔离。

  1. 持久性(Durability)

一个事务一旦被提交,它对数据库中的数据改变就是永久性的。

2. 事务的隔离级别

MySQL支持多种隔离级别,用于控制事务之间的可见性和并发访问的行为。以下是MySQL支持的四种标准隔离级别:

  1. 读未提交(Read Uncommitted)

    • 在这个隔离级别下,一个事务可以看到其他事务未提交的修改。这意味着一个事务可以读取其他事务中尚未持久化到数据库的数据,可能导致脏读、不可重复读和幻读问题
    • 这个隔离级别提供了最低程度的隔离,因为它允许事务读取未提交的数据。一般情况下不建议使用这个隔离级别。
  2. 读已提交(Read Committed)

    • 在这个隔离级别下,一个事务只能看到其他事务已经提交的修改。这可以防止脏读问题,但是仍然允许不可重复读和幻读问题的出现
    • 这个隔离级别是MySQL默认的隔离级别
  3. 可重复读(Repeatable Read)

    • 在这个隔离级别下,一个事务在整个事务过程中看到的数据保持一致,即使其他事务在该事务运行期间对数据进行了修改。这可以防止脏读和不可重复读问题,但仍然允许幻读问题的出现
    • 在可重复读隔离级别下,MySQL使用锁定读来确保查询结果的一致性。
  4. 串行化(Serializable)

    • 在这个隔离级别下,事务之间完全隔离,每个事务看到的数据是独立的。这可以防止脏读、不可重复读和幻读问题的出现,但是可能会降低并发性能,因为它会对数据进行严格的锁定。
    • 在串行化隔离级别下,MySQL会对查询的数据进行行级锁定,以确保事务之间的完全隔离性。

3. 隔离级别可以解决的并发事务问题:

  • 脏读(Dirty Read)一个事务读取了另一个事务未提交的数据。读已提交及以上的隔离级别都可以解决脏读问题。
  • 不可重复读(Non-Repeatable Read)一个事务对同一行数据进行了多次读取,但在读取过程中发现了不一样的值。可重复读及以上的隔离级别可以解决不可重复读问题。
  • 幻读(Phantom Read)一个事务对同一范围的数据进行了两次查询,但在查询过程中发现了不一样的数据量。可重复读及以上的隔离级别可以解决幻读问题。

选择合适的隔离级别取决于应用程序的需求和对数据一致性的要求。需要注意的是,隔离级别越高,通常会导致性能损失,因为它需要更多的锁定和资源管理来确保数据的一致性。

综上所述可以总结为下列表格,便于记忆: image.png