【MYSQL】MYSQL的事务隔离级别及解决的问题


下面说的都是针对MYSQL的InnoDB引擎,MyISMA无事务

无事务会出现的问题

脏读

事务A与事务B同时插入数据,事务B读取数据集(集合A),但是事务A因为某种原因回滚了,此时事务B再次读取数据集(集合B),集合A就会比集合B多数据,此情况在未提交可读级别下可以发生,其他三个级别都可以避免。

不可重复读

事务B在读取某条数据后,事务A对着条数据进行了修改并且提交事务,然后事务B再次读取了此行数据,两次读取的数据行数据不一致,此为不可重复读。此情况在提交可读和未提交可读都会发生。

幻读

事务B在读取数据集(数据集A)后,事务A又插入了几行数据或者删了几条数据,并且提交,然后事务B再次读取此条件的数据集(数据集B),数据集B会比数据集A多出数据。明明之前没有的数据,现在有了或没了,好像幻觉一样,故为幻读。此情况在未提交可读,提交可读和可重复读都可发生,只是在可重复读级别下,必须得是“当前读”的情况才会出现,详见下文。

幻读和不可重复读的区别?

幻读强调的是在一个事务中,对于一个范围的数据集,多次执行相同查询数据条目数量上的改变。
而不可重复读指的是对于一行数据,一个事务中多次查询字段值发生了改变。

MYSQL隔离级别

未提交可读

事务A在未提交事务的情况下对数据行的修改就可以被事务B访问

提交可读

事务A的修改只有在提交之后才对事务B可见

可重复读

详细解读:
mysql可重复读详解
是MYSQL的默认事务级别,提供了版本号机制,事务在开始时会申请一个事务id,此id是根据事务先后顺序严格递增的,InnoDB 的行数据有多个版本,每个版本都有 行事务id,对于一个事务只能看到低于本事务id的行值,而之后事务进行的修改不可见。但是当之后事务新插入行或者删除(注意mysql的删除并非真的删除,而是打上删除标记,并且具有版本号)时,版本号肯定高于当前事务啊,为什么会出现幻读呢?

可重复读的两种读取方式

快照读:普通的select进行的是快照读,即上面介绍的可重复读的读取方式,此种方式不会出现幻读。
当前读:在下面情况时读取的是当前所有已提交事务,类似提交可读,会出现幻读。
SELECT * FROM player LOCK IN SHARE MODE;
SELECT * FROM player FOR UPDATE;
INSERT INTO player values …
DELETE FROM player WHERE …
UPDATE player SET …

可串行化

不使用,不议

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值