REPEATABLE-READ隔離級別
馬克- to-win:馬克 java社區(qū):防盜版實(shí)名手機(jī)尾號: 73203。
馬克-to-win:既然我們教材用mysql,我們仔細(xì)研究一下mysql缺省情況,即兩個(gè)窗口都是REPEATABLE-READ(可重復(fù)讀)級別的情況。兩個(gè)窗口都開始事務(wù)以后,窗口2的update,delete,insert,窗口1肯定都看不見。但雙方如果都同時(shí)update,delete,insert的話,雖然會被block住,但一旦最后兩個(gè)窗口都提交,兩個(gè)窗口的效果是累加的。馬克-to-win:舉幾個(gè)例子:1)比如窗口2先要減1,雖然窗口1看不見這種變化,窗口1如果也要減1的話,雖然當(dāng)時(shí)被block住,但只要窗口2提交的話,窗口1竟然憑著select * from table能夠看到累加的效果,即一共減了2。換句話說,窗口1如果不update一下,就不會看到窗口2的update的效果。2)同樣道理,如果窗口 2刪除了一條記錄,提交以后,窗口1未提交之前,還以為這條記錄存在呢。select時(shí)發(fā)現(xiàn)還有,但update時(shí),不能update,也不報(bào)錯(cuò)。提交以后才發(fā)覺,數(shù)據(jù)早沒有了。更新半天,都是瞎忙活。馬克-to-win:也好理解,因?yàn)榇翱?早delete了嘛!3)如果窗口2增加一條,窗口1也想增加同樣主鍵的這條記錄(因?yàn)榭床坏竭@條主鍵的記錄),暫時(shí)被擋住以后,當(dāng)窗口2提交,窗口1會報(bào)錯(cuò),說試圖增加重復(fù)鍵。4)窗口1想更新全部的記錄為紅色,同時(shí)窗口2想插入一條藍(lán)色的,被擋住后不能動(dòng)彈鍵盤。窗口1必須先提交,select一下,沒發(fā)覺藍(lán)色的,等窗口2提交以后,大家都發(fā)覺,所有的都變成了紅色,除了新插入的一條是藍(lán)色。所以還是符合提交的變化都會生效,變化的效果是累加的。5)窗口2增加一條,窗口1死活看不到這一條。即使看不見,如果愣更新這條記錄的話,會被擋在那里。馬克-to-win:這時(shí)如窗口2提交,窗口1簡單select,就可以看到自己update的效果。mysql的策略是,只要你疊加在別人的修改之上修改了,在你提交之前,是可以看到這種修改的,即使你的窗口級別是REPEATABLE-READ(可重復(fù)讀)。