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