【ⓂMySQL】MySQL三种并发问题以及四种隔离级别

并发读:脏读、不可重复读、幻读

如果不对事务进行隔离性的保障,则在多个事务并发进行时,可能出现:脏读、不可重复读、幻读。

脏读

一个事务处理过程中,读取了另一个事务还未提交的数据。

举例:

  1. money = 0.
  2. 事务A、B开启。
  3. 事务A将money修改为100,但还未提交。
  4. 事务B执行money = money + 100,将money修改为200。
  5. 事务A回滚,事务B提交。
  6. 异常:经过一次自增100的操作,money却增加了200。

重点:针对还未提交的数据。

不可重复读

一个事务处理过程中,对同一数据的多次查询得到不同的结果,这是由于另一个事务在多次查询间隔修改了这个数据。

举例:

  1. money = 0。
  2. 事务A、B开启。
  3. 事务B第一次读取money = 0。
  4. 事务A修改money为100,然后提交。
  5. 事务B第二次读取money = 100。
  6. 异常:在同一个事务中,对money的两次读取,结果不同。

重点:针对被修改且已提交的数据。

幻读

一个事务处理过程中,读取了另一个事务新增加或删除的数据。

举例:

  1. 表中共计10条记录。
  2. 事务A、B开启。
  3. 事务B第一次count,获悉count(id) = 10。
  4. 事务A新增了2条记录,删除了一条记录,然后提交。
  5. 事务B第二次count,获悉count(id) = 11。
  6. 异常:在同一个事务中,对表中数据总条数的两次统计,结果不同。

重点:针对新增删且已提交数据。

四种隔离级别

MySQL提供了四种事务隔离级别,从低到高依次是:读未提交、读已提交、可重复读、串行化。

读未提交Read Uncommitted

简单理解:一个事务可以读取Read到其他事务未提交Uncommitted的数据。

解决的并发事务问题:最低级别,无法解决任何问题。

未解决的并发事务问题:脏读、不可重复读、幻读。

读已提交 Read Committed

简单理解:一个事务需要读取Read到其他事务已经提交Committed的数据。

解决的并发事务问题:因为已提交的保证,能够避免脏读的出现。

未解决的并发事务问题:不可重复读、幻读。

可重复读Repeatable Read

简单理解:一个事务能够对同一记录进行重复性的Repeatable读取Read,多次读取结果一致。

解决的并发事务问题:不可重复读、脏读。

未解决的并发事务问题:幻读

特别:MySQL的默认事务隔离级别

串行化Serializable

简单理解:多个事务以串行化Serializable的方式运行,自然不会产生并发事务问题。

解决的并发事务问题:幻读、不可重复读、脏读。

特别:效率特别低。

三种并发读与四种事务隔离级别的总结

隔离级别 脏读 不可重复读 幻读
读未提交 未解决 未解决 未解决
读已提交 解决 未解决 未解决
可重复读 解决 解决 未解决
串行化 解决 解决 解决

隔离级别的查看与设置

-- 查看
select @@tx_isolation;
-- 设置
set tx_isolation='read-committed';

 

posted @ 2023-05-16 08:34  残城碎梦  阅读(56)  评论(0编辑  收藏  举报