首页 > 数据库技术 > 详细

MySql事务等级和幻读

时间:2019-03-26 17:58:58      阅读:148      评论:0      收藏:0      [点我收藏+]

四个事物等级

  • read uncommitted :有可能脏读

    一个事务过程中读取到了,另一个事务的中途数据

  • read committed :有可能不可重复读

    即在一次事务之间,进行了两次读取,但是结果不一样,可能第一次id为1的人叫“李三”,第二次读id为1的人就叫了“李四”。因为读取操作不会阻止其他事务

  • repetable read :有可能幻读

    幻读侧重的方面是某一次的 select 操作得到的结果所表征的数据状态无法支撑后续的业务操作。更为具体一些:select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入,此时就发生了幻读

  • serializable :效率最低

    可避免幻读。读加共享锁,写加排他锁。这样读取事务可以并发,但是读写,写写事务之间都是互斥的,基本上就是一个个执行事务,所以叫序列化

查看当前事务等级

SELECT @@global.tx_isolation, @@tx_isolation;   

触发幻读

  • 事前准备

create table t1 (
    id int(10),
    age int(3),
    primary key(id)
)
  • 触发过程
事务1 事务2 步骤
begin 1
select * from t1 where id =1 2
insert into t1 values (1,12) 3
insert into t1 values(1,12) 4

? 在事务1中,先查询有没有id = 1的记录,如果没有就插入,但是在查询后,事务2先插入了,那么事务1就出现错误

技术分享图片

解决幻读

事务1 事务2 步骤
begin 1
select * from t1 where id =1 for update 2
insert into t1 values (1,12) 3
insert into t1 values(1,12) 4
commit 5

技术分享图片

在Step2执行后,数据库会加一个X锁(排它锁)。这时Step3执行后,会一直等待事务1执行完毕,当事务1 commit后,事务2就报错了

MySql事务等级和幻读

原文:https://www.cnblogs.com/ahmczsy/p/10601697.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!