摘要:悲觀鎖非常影響并發(fā)性能,所以謹慎使用樂觀鎖假定當前事務操縱數(shù)據(jù)資源時,不會有其他事務同時訪問該數(shù)據(jù)資源,樂觀鎖使用由程序邏輯控制的技術來避免可能出現(xiàn)的并發(fā)問題。讀取出數(shù)據(jù)時,將此版本號一同讀出,之后更新時,對此版本號加一。
一.事務的特性(ACID)
1.原子性:單個或多個操作為一個整體,要么全執(zhí)行,要么全不執(zhí)行(回滾)
2.一致性:事務執(zhí)行是從一個一致性狀態(tài)轉(zhuǎn)為另一個一致性狀態(tài)
3.隔離性:一個事務在提交前對數(shù)據(jù)的修改對于其它事務不可見
4.持久性:事務一旦提交對數(shù)據(jù)的改變是永久的
1.丟失數(shù)據(jù)修改 (修改的數(shù)據(jù)被其它線程事務覆蓋)
2.臟讀(B事務讀取了A事務尚未提交的數(shù)據(jù),且A事務回滾數(shù)據(jù))
3.不可重復讀(一個事務中兩次讀取的數(shù)據(jù)內(nèi)容不一致,重點在update)
4.幻讀(一個事務中兩次讀取的數(shù)據(jù)量不一致,重點在insert,delete)
1.1 共享鎖和排他鎖
(1)共享鎖(S鎖,讀鎖):本事務只可進行讀操作,其它事務加S鎖也可讀 (2)排他鎖(x鎖,寫鎖):本事務可進行讀寫,不允許其它事務加鎖和操作 (3)更新所(u鎖):防止通常形式的死鎖,兩個擁有共享鎖的事務要同時更新數(shù)據(jù)時,需要將共享鎖轉(zhuǎn)換為排他鎖,所以他們都需要X鎖并且要等待對方釋放s鎖(x鎖和其它事務的S鎖不兼容),會發(fā)生死鎖
1.2 臨時鎖與持續(xù)鎖
鎖的時效性,指明加鎖生效期是當前語句結(jié)束還是當前事務結(jié)束
1.3表級鎖和行級鎖
鎖的粒度,指明加鎖的對象是當前表還是當前行
1.4樂觀鎖和悲觀鎖
這兩種鎖的說法,主要是對“是否真正在數(shù)據(jù)庫層面加鎖”進行討論。
(1)悲觀鎖:悲觀鎖假定當前事務操縱數(shù)據(jù)資源時,肯定還會有其他事務同時訪問該數(shù)據(jù)資源,為了避免當前事務操作受到影響,悲觀鎖需使用數(shù)據(jù)庫的鎖機制實現(xiàn)。java中的synchronized鎖就是悲觀鎖。悲觀鎖非常影響并發(fā)性能,所以謹慎使用
(2)樂觀鎖假定當前事務操縱數(shù)據(jù)資源時,不會有其他事務同時訪問該數(shù)據(jù)資源,樂觀鎖使用由程序邏輯控制的技術來避免可能出現(xiàn)的并發(fā)問題。最常用的方式是基于數(shù)據(jù)版本記錄機制實現(xiàn)(一般是通過為數(shù)據(jù)庫表增加一個 “version” 字段來實現(xiàn)。讀取出數(shù)據(jù)時,將此版本號一同讀出,之后更新時,對此版本號加一。此時,將提交數(shù)據(jù)的版本數(shù)據(jù)與數(shù)據(jù)庫表對應記錄的當前版本信息進行比對,如果提交的數(shù)據(jù)版本號大于數(shù)據(jù)庫表當前版本號,則予以更新,否則認為是過期數(shù)據(jù))所以不能避免臟讀問題
(1) 讀未提交:事務寫阻塞其它事務的寫不阻塞讀(加“持續(xù)-X鎖”實現(xiàn)) ---避免丟失數(shù)據(jù)修改 (2)讀已提交:事務寫會阻塞其它事務的讀和寫(寫操作加“持續(xù)-X”鎖,讀操作加“臨時-S鎖”實現(xiàn)) ---避免丟失數(shù)據(jù)修改和臟讀 (3)可重復讀:事務讀會阻塞其它事務的寫,不會阻塞讀,事務寫會阻塞其它事務讀寫(寫操作加“持續(xù)-X”鎖,讀操作加“持續(xù)-S鎖”實現(xiàn)) ---避免丟失數(shù)據(jù)修改和臟讀和不可重復讀幻讀 (4)串行化:事務的最高級別,在每個讀的數(shù)據(jù)行上,加上鎖,使之不可能相互沖突,因此,會導致大量的超時現(xiàn)象 ---解決了所有問題3.三級加鎖協(xié)議
(1)一級加鎖協(xié)議:讀數(shù)據(jù)不加鎖,修改數(shù)據(jù)前加X鎖(解決丟失數(shù)據(jù)修改) (2)二級加鎖協(xié)議:讀取時加s鎖,修改時加x鎖(解決丟失數(shù)據(jù)修改+臟讀) (3)三級枷鎖協(xié)議:全程加x鎖和s鎖(解決所有問題)
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/17748.html
摘要:但是這將嚴重影響程序的性能。垂直分區(qū)的優(yōu)點在于可以使得行數(shù)據(jù)變小,在查詢時減少讀取的數(shù),減少次數(shù)。此外,垂直分區(qū)可以簡化表的結(jié)構,易于維護。垂直分區(qū)的缺點在于主鍵會出現(xiàn)冗余,需要管理冗余列,并會引起操作,可以通過在應用層進行來解決。 Java面試通關手冊(Java學習指南,歡迎Star,會一直完善下去,歡迎建議和指導):https://github.com/Snailclimb/Jav...
摘要:深入解析系列之并發(fā)控制與事務機制并發(fā)控制旨在針對數(shù)據(jù)庫中對事務并行的場景,保證中的一致性與隔離。啟動并執(zhí)行第一個命令。事務管理器分配,并返回事務快照,因為正在進行中。意味著該行由另一個并發(fā)事務更新,并且其事務尚未終止。 showImg(https://segmentfault.com/img/remote/1460000018081793); 深入解析 PostgreSQL 系列整理...
閱讀 3891·2021-09-10 11:22
閱讀 2365·2021-09-03 10:30
閱讀 3677·2019-08-30 15:55
閱讀 1921·2019-08-30 15:44
閱讀 855·2019-08-30 15:44
閱讀 603·2019-08-30 14:04
閱讀 3056·2019-08-29 17:18
閱讀 1278·2019-08-29 15:04