web前端三大主流框架 mysql怎么查看是表鎖還是行鎖?
mysql怎么查看是表鎖還是行鎖?MyISAM不支持事物,所以這些隔離級別是沒有意義的。然后再說一下這些隔離級別和鎖之間的關系(如在InnoDB中,支持行級鎖):首先一個事物由begin開始,由com
mysql怎么查看是表鎖還是行鎖?
MyISAM不支持事物,所以這些隔離級別是沒有意義的。然后再說一下這些隔離級別和鎖之間的關系(如在InnoDB中,支持行級鎖):首先一個事物由begin開始,由commit(成功執(zhí)行)或rollback(執(zhí)行失敗,需要回滾)終止,所以考慮事物問題的時候要考慮到事物的整個生命周期,對同一行數(shù)據(jù)的加鎖解鎖操作是有可能多次執(zhí)行的,因此傳統(tǒng)的2 Phase Locking(2PL,兩階段鎖)才會有很多變種,最簡單的是只要先統(tǒng)一上鎖,后統(tǒng)一釋放鎖就可以了,不用考慮釋放鎖的時間,最嚴格的是所有的鎖一旦加上之后,必須要等到事物commit或rollback后才可以釋放。舉個例子,有一行數(shù)據(jù) a,有兩個事物T1,T21.read uncommittedT1對a進行寫操作,寫之前加了寫鎖,寫之后但是commit前釋放了寫鎖,這時候T2是可以讀a的,由于T1還沒有commit,所以T2就發(fā)生了read uncommitted的情況。2.read committed還是1中的情況,如果T1把a的寫鎖一直保持到T1 commit成功之后再釋放,那么T2在T1 commit之前都是不可以讀a的,就可以避免read uncommitted,這就是read committed。但是這種隔離級別下,如果t1插入了一個以前不存在的新行b,t2是可以讀的,就造成了幻讀的情況。3.repeatable read為了避免幻讀,可以加謂詞鎖延遲新行的添加,比如T2要讀大于5的行,那么就加個謂詞鎖,使得大于5的行不能被添加進去,這種實現(xiàn)基本上也是實現(xiàn)了serializable read基于鎖的事物只是一種方法,一般被成為悲觀并發(fā)控制。此外,還有:樂觀并發(fā)控制:執(zhí)行讀寫的時候不加鎖,commit的時候檢測是否有沖突,若沒有沖突commit成功,否則需要rollback,值得注意的是,雖然讀寫的時候沒有加鎖,但是檢測的時候是要加鎖的,否則2個沖突的事物可能同時檢測成功,這一點絕大多數(shù)材料里都沒有指出。MVCC:給每個數(shù)據(jù)一個版本號,讀的時候完全不需要鎖,寫的時候看具體實現(xiàn),可以選擇樂觀并發(fā)控制,也可以選擇悲觀并發(fā)控制,這種實現(xiàn)很容易實現(xiàn)snapshot isolation(也是一種隔離級別,只不過沒有以上幾個名氣大,可以保證每個事物可以看到一個在它發(fā)生之前的數(shù)據(jù)庫完整實例)。