前言
之前的文章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产生的影响,这种影响叫做“幻读”。
新闻热点
疑难解答