博客
关于我
MySQL的事务隔离级别实战
阅读量:788 次
发布时间:2023-02-13

本文共 1449 字,大约阅读时间需要 4 分钟。

事务的基本要素(ACID)及其并发问题

事务的基本要素(ACID)

事务是数据库操作的基本单元,确保数据的完整性和一致性。ACID(原子性、一致性、隔离性、持久性)是事务管理的四个核心要素。

1. 原子性(Atomicity)

事务执行过程中,要么全部完成,要么全部回滚。例如,银行转账必须确保资金从A账户转移到B账户,否则会导致经济损失。数据库系统会记录所有操作,确保事务的原子性。

2. 一致性(Consistency)

事务执行前后,数据库状态不会出现不一致。例如,A向B转账后,A的钱减少,B的钱增加,这种状态必须保持一致。

3. 隔离性(Isolation)

同一时间,同一数据只能被一个事务操作。例如,A正在从一张银行卡取钱时,B不能立即修改这张卡的数据。

4. 持久性(Durability)

事务完成后,所有修改会被永久保存到数据库,防止数据丢失。

事务并发问题

1. 脏读(Dirty Read)

事务A读取了事务B尚未提交的数据,但事务B回滚后,A仍然看到B的数据。这会导致数据不一致。

2. 不可重复读(Non-Repeatable Read)

事务A多次读取同一数据时,由于事务B在A读取期间修改了数据,A可能多次读到不同的结果。

3. 幻读(Phantom Read)

事务A执行查询时,发现数据状态与事务A之前的查询结果不一致。这是由于事务B在A查询期间插入或删除了数据。

小结

不可重复读和幻读容易混淆。不可重复读侧重于修改操作,而幻读侧重于新增或删除操作。解决不可重复读的方法是锁住相关行,解决幻读需要锁表。

MySQL事务隔离级别

1. 读未提交(Read Uncommitted)

  • 脏读:是
  • 不可重复读:是
  • 幻读:是

2. 读已提交(Read Committed)

  • 脏读:否
  • 不可重复读:是
  • 幻读:是

3. 可重复读(Repeatable Read)

  • 脏读:否
  • 不可重复读:否
  • 幻读:是

4. 串行化(Serializable)

  • 脏读:否
  • 不可重复读:否
  • 幻读:否

默认事务隔离级别

MySQL默认事务隔离级别为可重复读(Repeatable Read)。

事务隔离级别示例

1. 读未提交示例

  • 客户端A设置事务模式为read uncommitted,查询表。
  • 在A提交事务之前,客户端B更新表。
  • B事务未提交,但A可以读到B的脏数据。

2. 读已提交示例

  • 客户端A设置事务模式为read committed
  • 在A提交事务之前,客户端B更新表。
  • B提交事务后,A可以读到最新数据,避免了脏读。

3. 可重复读示例

  • 客户端A设置事务模式为repeatable read
  • 在A提交事务之前,客户端B更新表并提交。
  • A读取数据时,看到的数据与B提交前一致,避免了不可重复读。

4. 串行化示例

  • 客户端A设置事务隔离级别为serializable
  • 客户端B在相同隔离级别下尝试插入数据,操作会失败,因表被锁。

补充说明

  • SQL规范定义的事务隔离级别,数据库具体实现可能存在差异。
  • MySQL中,默认事务隔离级别为可重复读时不会锁住读取到的行。
  • 读已提交时,写操作会锁住相应行。
  • 可重复读时,索引列为条件的更新可能导致间隙锁问题。
  • 串行化时,读写操作会锁住整张表。
  • 对于大多数应用程序,推荐将数据库隔离级别设置为Read Committed,它能避免脏读,同时具有较好的并发性能。对于可能出现不可重复读或幻读的场景,可以通过应用程序使用悲观锁或乐观锁来控制并发问题。

    转载地址:http://xvdfk.baihongyu.com/

    你可能感兴趣的文章
    MySQL外键约束
    查看>>
    MySQL多表关联on和where速度对比实测谁更快
    查看>>
    MySQL多表左右连接查询
    查看>>
    mysql大批量删除(修改)The total number of locks exceeds the lock table size 错误的解决办法
    查看>>
    mysql如何做到存在就更新不存就插入_MySQL 索引及优化实战(二)
    查看>>
    mysql如何删除数据表,被关联的数据表如何删除呢
    查看>>
    MySQL如何实现ACID ?
    查看>>
    mysql如何记录数据库响应时间
    查看>>
    MySQL子查询
    查看>>
    Mysql字段、索引操作
    查看>>
    mysql字段的细节(查询自定义的字段[意义-行列转置];UNION ALL;case-when)
    查看>>
    mysql字段类型不一致导致的索引失效
    查看>>
    mysql字段类型介绍
    查看>>
    mysql字段解析逗号分割_MySQL逗号分割字段的行列转换技巧
    查看>>
    MySQL字符集与排序规则
    查看>>
    MySQL字符集乱码
    查看>>
    mysql存储IP地址的数据类型
    查看>>
    mysql存储中文 但是读取乱码_mysql存储中文乱码
    查看>>
    MySQL存储引擎--MyISAM与InnoDB区别
    查看>>
    mysql存储总结
    查看>>