2018.04.16
丟失修改鸳劳。
排他鎖(eXclusive Lock)狰贯,X 鎖。用于寫數(shù)據(jù)赏廓。commit 后才釋放涵紊。
臟數(shù)據(jù)。
進程讀到未提交的內(nèi)容幔摸。
一個程序讀后摸柄,另一個程序提交前再次修改,則讀的是臟數(shù)據(jù)既忆。
共享鎖(Share Lock)塘幅,S 鎖。用于讀取數(shù)據(jù)尿贫。
多個進程可同時獲取 S 鎖。
一個數(shù)據(jù)加了 X 鎖就無法加 S 鎖踏揣,反之亦然庆亡。
讀數(shù)據(jù)時,S 鎖需要一直鎖定捞稿,直到事務(wù)提交又谋。否則釋放鎖后,再次讀數(shù)據(jù)可能不一致娱局。
幻讀:一個事務(wù)內(nèi)兩次查詢中數(shù)據(jù)條數(shù)不一致彰亥。
查詢到符合某條件的數(shù)據(jù)項,X 鎖鎖定這些數(shù)據(jù)項衰齐,另一個程序插入新的數(shù)據(jù)項恰好符合條件任斋,持 X 鎖的程序再次查詢時,數(shù)據(jù)項增多耻涛。
數(shù)據(jù)庫事務(wù)的隔離級別
read uncommitted:一個程序 read 時废酷,另一個持 X 鎖的程序尚未 commit 瘟檩。沒有 S 鎖。解決了丟失修改澈蟆。
read committed:用 S 鎖與 X 鎖不能同時加來保證墨辛。解決了臟數(shù)據(jù)。
repeatable read:用 S 鎖 commit 后才釋放來保證趴俘。解決了重復(fù)讀睹簇。
serializable:事務(wù)操作必須順序執(zhí)行。解決了幻讀寥闪。
MVCC
多版本并發(fā)控制
在讀的時候不用加鎖太惠,也能實現(xiàn)可重復(fù)讀。
有兩種事務(wù) ID橙垢,一是進程的事務(wù) ID垛叨,二是一條記錄的事務(wù) ID。
有一個叫 Read View 的數(shù)據(jù)結(jié)構(gòu)柜某,它由三部分組成:
一:活躍的進程事務(wù) ID 列表嗽元。
二:活躍的進程事務(wù) ID 最小值 Tmin。
三:最大進程事務(wù) ID 最大值加一 Tmax喂击。
每條記錄有兩個額外的字段 tid剂癌、回滾指針。
一個進程對某條記錄修改后翰绊,tid 更新到當(dāng)前進程佩谷,回滾指針指向記錄的上一個版本。
http://mp.weixin.qq.com/s/cbaR--hlEN37fwTIRNhKaQ
http://mp.weixin.qq.com/s/EjVfk1iOuQUjLfPxt_DJ7Q
http://mp.weixin.qq.com/mp/homepage?__biz=MzAxOTc0NzExNg==&hid=4&sn=568693fc15f6e3693deaf11fcf489abc&scene=18#wechat_redirect