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