參考:
首先,表中每一行有兩個隱藏值data_trx_id和data_roll_ptr,
前者為最後一次修改該行的事務id,後者為指向該行的上一條歷史記錄的指標,用於不斷回溯得到想要的歷史記錄。
每次select時都會生成乙個檢視read_view,其為乙個[min,max]陣列,
這個陣列表示當前未提交的所有事務id,其中當前事務id也位於這個陣列中。
我們可以根據data_trx_id與[min,max]的關係劃分為四個部分:
1.max,表示該行在該事務之後被提交
3.位於[min,max]內,表示該行被修改但未被提交
4.==當前事務id,表示該行被該事務修改過
分析這四種情況:
1、表示該資料在事務開始前就被提交;
2、表示該資料在該事務之後被提交過,也就是這個該行與事務剛開始的時候已經不一樣了,讀這個資料會出現不可重複讀的情況;
3、表示讀到了髒資料;
4、表示這個資料是自己修改的,可以放心讀
那麼,避免髒資料就是為了避免情況3,那麼通過不斷回溯得到1、2、4這三種情況即可;為了避免不可重複讀,那麼通過不斷回溯得到情況1、4即可。但是,避免幻讀是不行了,畢是在事務後被插入資料,它的data_trx_id肯定比當前事務id大,則必然屬於2、3兩種情況,這兩種情況都會產生幻讀。
堆疊的一些理解
堆疊是一種執行 後進先出 演算法的資料結構。設想有乙個直徑不大 一端開口一端封閉的竹筒。有若干個寫有編號的小球,小球的直徑比竹筒的直徑略小。現在把不同編號的小球放到竹筒裡面,可以發現一種規律 先放進去的小球只能後拿出來,反之,後放進去的小球能夠先拿出來。所以 先進後出 就是這種結構的特點。堆疊就是這...
const 的一些理解
以前覺得自己對const還是有些理解的,今天一兄弟問了乙個問題才讓我對這個東西又加深了些了解 class temp public void output void func const temp a a.output 就這麼簡單乙個東西,眨眼一看,沒什麼問題,但是編譯是不會通過的,因為func呼叫了...
linuxI O的一些理解
同步i o 阻塞i o 非同步i o 非阻塞 同步,非同步的概念本來是通訊領域的,很難解釋清楚,但我肯定他跟阻塞非阻塞完全沒有任何關係。在這裡的同步非同步,我個人的理解是函式呼叫的時候的同步非同步。其實同步方式很好理解,例如你呼叫乙個function,當這個function執行完後,這個方法實現的功...