好的學習連接: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中數據的存放仍是會經過版本記錄一系列的歷史數據,這樣,能夠根據版本查找數據。