1. 事務的特性(acid):
(1) 原子性 atomicity: 事務所包含的資料庫操作要麼都做,要麼都不做
(2) 一致性 consistency: 事務前後,所有的資料都保持一致的狀態
例如:事務之前a,b兩個賬戶的總和是10萬(a: 4w, b: 6w), 現在a轉賬2w給b (a: 2w, b: 8w)
a, b賬戶總和依舊是10w,如果不是10w的話,則事務前後對於賬戶總和這種資源是不一致的。
(3) 隔離性 isolation: 事務對資料的操作不能夠受到其他事務的影響
(4) 持續性 durability: 資料庫事務一旦提交,其對資料庫中資料的改變應該是永久性的
2. 事務的結束方式包括:
commit, rollback
3. 破壞事務acid特性的因素包括:
(1) 多個事務並行執行,不同的操作交叉執行
(2) 事務在執行過程中被強行終止
4. 併發事務帶來的問題:
資料庫併發的事務會帶來以下問題:
(1) 髒讀:事務a修改資料時,事務b讀取了該資料,但是事務a由於某種原因取消了對資料的修改,使資料返回了原狀態,這時事務b讀取的資料與資料庫中的資料就會不一致。
(2) 不可重複讀:事務a讀取資料庫中的資料後,事務b更新了該資料,當事務a再次讀取該資料時,就會發現資料已經發生了改變
(3) 幻影讀:事務a基於某個條件讀取資料後,事務b在同乙個表中插入了一條資料,這時事務a基於相同的條件再次讀取資料時,返回了不同的行
5. 事務隔離級別
為了保證資料的一致性,一般採用了事務隔離機制,又稱為事務序列化,用來保證事務盡量按照序列的方式執行
級別1:讀取未提交,這種併發性最高,但會導致上述三個問題
級別2:讀取已提交,這是oracle的預設隔離級別
級別3:可重複讀
級別4:序列,這種隔離級別最高,但資料庫併發會受到很大的限制,可以避免上述三個問題,但專案中不會採用
6. 資料庫鎖
資料庫是乙個多使用者使用的共享資源,當多個使用者併發地訪問資料時,在資料庫中就會產生多個事務同時訪問同一資料的情況。若對併發操作不加控制就可能會讀取和儲存不正確的資料,破壞資料庫的一致性。
加鎖是實現資料庫併發控制的乙個非常重要的技術,當事務在對某個資料物件進行操作前,先向系統發出請求,對其加鎖,加鎖後事務就對該資料物件有了一定的控制,在該事務釋放鎖之前,其他的事務不能對此資料物件進行更新操作。
兩種鎖機制:
共享鎖(s鎖):加了共享鎖的資料庫物件可以被其他事務讀取,但是不能被其他事務修改。
獨佔鎖(x鎖):加了獨佔鎖的資料庫物件不能被其他事務讀取和修改。
commit或rollback後,事務所使用的鎖被釋放。
7. 資料庫鎖的型別:
(1) dml鎖(data locks 資料鎖):能夠防止同步衝突的dml和ddl操作的破壞性,是oracle主要的鎖,又包括表級鎖(tm鎖)和行級鎖(tx鎖)
當oracle執行dml語句的時候,系統自動在所要操作的表上申請tm型別的鎖,當tm鎖獲得後,系統再自動申請tx型別的鎖。
當多個會話在表的同一條記錄上執行dml語句時,第乙個會話在該條記錄上加鎖,其他的會話處於等待狀態,當第乙個會話提交後,tx鎖會被釋放,其他的會話才可以加鎖。
當oracle資料庫產生tx鎖等待時,如果不及時處理常常會引起oracle資料庫掛起或導致死鎖的產生。
死鎖:
當兩個使用者互相等待對方釋放資源時,oracle認定為產生了死鎖,將以犧牲乙個使用者作為代價,另乙個使用者繼續執行,犧牲的使用者的事務將回滾。
例子:使用者1對a表進行update,沒有提交
使用者2對b表進行update,沒有提交
如果使用者2此時對a表做update,則會發生阻塞,需要等待使用者1的事務結束
如果此時使用者1對b表做update,則產生死鎖,此時oracle會選擇其中乙個使用者進行回滾,使另乙個使用者繼續執行操作。
(2) ddl鎖(dictionary locks字典鎖): 用於保護資料庫物件的結構,如表、索引的結構定義
問題:既然有了鎖,為什麼還要隔離級別?
事務隔離級別是併發控制的整體解決方案,其實際上是綜合利用各種型別的鎖和行版本控制來解決併發問題。
鎖是資料庫併發控制的內部機制,是基礎
對使用者來說,只有當事務隔離級別無法解決一些併發問題和需求時,才有必要在語句中手動設定鎖,不恰當的設定鎖可能導致嚴重的阻塞和死鎖。建議在完全了解鎖機制的情況下,才可以再語句中手動設定鎖,否則應該使用事務隔離級別。
Oracle 事務隔離級別和鎖
1.事務的特性 acid 1 原子性 atomicity 事務所包含的資料庫操作要麼都做,要麼都不做 2 一致性 consistency 事務前後,所有的資料都保持一致的狀態 例如 事務之前a,b兩個賬戶的總和是10萬 a 4w,b 6w 現在a轉賬2w給b a 2w,b 8w a,b賬戶總和依舊是...
SQLserver鎖和事務隔離級別
隔離級別 隔離級別 髒讀不可重複讀 幻象說明 未提交讀 read uncommitted 是是 是如果其他事務更新,不管是否提交,立即執行 提交讀 read committed預設 否是 是讀取提交過的資料。如果其他事務更新沒提交,則等待 可重複讀 repeatable read 否否 是查詢期間,...
MySQL的事務隔離級別和鎖
mysql的事務隔離級別 read uncommitted 讀未提交資料 read committed 讀已提交資料 repeatable read 可重讀 serializable 可序列化 檢視mysql的事務隔離級別 預設 全域性和會話事務隔離級別 select tx isolation se...