前言
之前的文章mysql锁机制详解中我们详细讲解了innodb的锁机制,锁机制是用来保证在并发情况下数据的准确性,而要保证数据准确通常需要事务的支持,而mysql存储引擎innodb是通过锁机制来巧妙地实现事务的隔离特性中的4种隔离级别。
事务ACID特性,其中I代表隔离性(Isolation)。隔离性是指,多个用户的并发事务访问同一个数据库时,一个用户的事务不应该被其他用户的事务干扰,多个并发事务之间要相互隔离。
我们都知道事务的几种性质,数据库中的一致性和隔离性等是实现事务的基本思想,在系统有大量的并发访问的情况下,了解和熟练应用数据库的本身的事务隔离级别,对于写出健壮性,并发处理能力强的代码还是起关键的作用。
1. 事务之间如何互相干扰
一个事务是如何干扰其他事务呢?举个例子,有如下表:
create table lock_example(id smallint(10),name varchar(20),primary key id)engine=innodb;
表中有如下数据:
1, zhangsan
2, lisi
3, wangwu
demo1:
事务A,先执行,处于未提交的状态:
insert into t values(4, 'zhaoliu');
事务B,后执行,也未提交:
select * from t;
如果事务B能够读取到(4, zhaoliu)这条记录,说明事务A就对事务B产生了影响,这种影响叫做“读脏”,即读到了未提交事务操作的记录。
demo2:
事务A,先执行:
select * from t where id=1;
结果集为
1,zhangsan
事务B,后执行,并且提交:
update t set name=xxx where id=1; commit;
事务A,再次执行相同的查询:
select * from t where id=1;
结果集为:
1, xxx
这次是已提交事务B对事务A产生的影响,这种影响叫做“不可重复读”,即一个事务内相同的查询,却得到了不同的结果。
demo3:
事务A,先执行:
select * from t where id>3;
结果集为:
NULL
事务B,后执行,并且提交:
insert into t values(4, zhaoliu); commit;
事务A,首次查询了id>3的结果为NULL,于是想插入一条为4的记录:
insert into t values(4, xxoo);
结果集为:
Error : duplicate key!
你可能会想。。。你TM在逗我?查了id>3为空集,insert id=4时又告诉我PK冲突?→_→
这次是已提交事务B对事务A产生的影响,这种影响叫做“幻读”。
如上,并发的事务可能导致其他事务出现读脏、不可重复读、幻读。为了避免如上情况出现,innodb又做了哪些努力呢?
2. InnoDB实现了哪几种事务的隔离级别"color: #ff0000">3. 四种事务的隔离级别,innodb如何实现"htmlcode">
此时,可能读取到不一致的数据,即“读脏”。这是并发最高,一致性最差的隔离级别。 b. 读提交(Read Committed, RC) 此时,其他事务的插入依然可以执行,就可能导致,读取到幻影记录。该级别是最常使用的。而且如果是不上锁的select,可能产生不可重复读。 该级别下是通过快照读来防止读脏的。因为在该级别下的快照读总是能读到最新的行数据快照,当然,必须是已提交事务写入的,所以可能产生不可重复读。 c. 可重复读(Repeated Read, RR) 这是InnoDB默认的隔离级别,在RR下: 在该级别下 d. 串行化(Serializable) 这种事务的隔离级别下,所有select语句都会被隐式的转化为select ... in share mode,也就是默认上共享读锁(S锁)。 所以,如果事务A先执行如下sql之后,会尝试获取所查询行的IS锁(和别的IS、IX锁是兼容的),这时别的事务也能获取这些行的IS锁甚至是S锁,但是如果接下来,事务A如果update或delete其中的某些行,这时就获取了X锁,别的事务即便是执行普通的select语句也会阻塞,因为它们尝试获取IS锁,但是IS锁和X锁是互斥的,这样就避免了读脏、不可重复读以及幻读,所有事务就只能串行了。 这是一致性最好的,但并发性最差的隔离级别。高并发量的场景下,几乎不会使用上述a和d这两种隔离级别。 4. 总结 并发事务之间相互干扰,就可能导致事务出现读脏,不可重复读,幻读等问题。 InnoDB实现了SQL92标准中的四种隔离级别: InnoDB默认的隔离级别是RR,用得最多的隔离级别是RC 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
SELECT statements are performed in a nonlocking fashion.
select ... ;
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?