好的学习连接:http://blog.csdn.net/taylor_tao/article/details/7063639
innodb的默认事务隔离级别是rr(可重复读)。它的实现技术是mvcc。基于版本的控制协议。该技术不只能够保证innodb的可重复读,并且能够防止幻读。可是它防止的是快照读,也就是读取的数据虽然是一致的,可是数据是历史数据。如何作到保证数据是一致的(也就是一个事务,其内部读取对应某一个数据的时候,数据都是同样的),同时读取的数据是最新的数据。innodb提供了一个间隙锁的技术。也就是结合grap锁与行锁,达到最终目的。当使用索引进行插入的时候,innodb会将当前的节点和上一个节点加锁。这样当进行select的时候,就不容许加x锁。那么在进行该事务的时候,读取的就是最新的数据。mysql
实现:
1. 快照读(snapshot read)sql
简单的select操做(不包括 select ... lock in share mode, select ... for update)并发
2.当前读(current read)mvc
select ... lock in share mode学习
select ... for updatespa
insert.net
update版本控制
deleteblog
在RR级别下,快照读是经过MVVC(多版本控制)和undo log来实现的,当前读是经过加record lock(记录锁)和gap lock(间隙锁)来实现的。
因此从上面的显示来看,若是须要实时显示数据,仍是须要经过加锁来实现。这个时候会使用next-key技术来实现。索引
总结:在mysql中,提供了两种事务隔离技术,第一个是mvcc,第二个是next-key技术。这个在使用不一样的语句的时候能够动态选择。不加lock inshare mode之类的就使用mvcc。不然使用next-key。mvcc的优点是不加锁,并发性高。缺点是否是实时数据。next-key的优点是获取实时数据,可是须要加锁。同时须要注意几点:1.事务的快照时间点是以第一个select来确认的。因此即使事务先开始。可是select在后面的事务的update之类的语句后进行,那么它是能够获取后面的事务的对应的数据。2.mysql中数据的存放仍是会经过版本记录一系列的历史数据,这样,能够根据版本查找数据。