好的學習鏈接:http://blog.csdn.net/taylor_tao/article/details/7063639
innodb的默認事務隔離級別是rr(可重復讀)。它的實現技術是mvcc。基於版本的控制協議。該技術不僅可以保證innodb的可重復讀,而且可以防止幻讀。但是它防止的是快照讀,也就是讀取的數據雖然是一致的,但是數據是歷史數據。如何做到保證數據是一致的(也就是一個事務,其內部讀取對應某一個數據的時候,數據都是一樣的),同時讀取的數據是最新的數據。innodb提供了一個間隙鎖的技術。也就是結合grap鎖與行鎖,達到最終目的。當使用索引進行插入的時候,innodb會將當前的節點和上一個節點加鎖。這樣當進行select的時候,就不允許加x鎖。那么在進行該事務的時候,讀取的就是最新的數據。
實現:
1. 快照讀(snapshot read)
簡單的select操作(不包括 select ... lock in share mode, select ... for update)
2.當前讀(current read)
select ... lock in share mode
select ... for update
insert
update
delete
在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中數據的存放還是會通過版本記錄一系列的歷史數據,這樣,可以根據版本查找數據。