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