事務的基本概念
資料庫事務是構成單一邏輯工作單元的操作集合
注意點:
1.資料庫事務可以包含乙個或多個資料庫操作,但這些操作構成乙個邏輯上的整體
2.構成邏輯整體的這些資料庫操作,要麼全部執行成功,要麼全部不執行
3.構成事務的所有操作,要麼全部對資料庫產生影響,要麼全部都不產生影響,即資料庫保持一致性狀態
4.併發操作下,事務的控制尤為關鍵。
事務的種類:
基本事務 宣告式事務 分布式事務
acid
atomicity:事務中的所有操作作為乙個整體像原子一樣不可分 要麼成功要麼失敗
快照保證原子性 undo log之後總結
consistency:事務執行結果必須使資料庫從乙個一致性狀態到另乙個一致性狀態
一致性狀態是指:1.系統的狀態滿足資料的完整性約束2.系統的狀態反應資料庫本應該描述的現實世界的真實狀態,比如轉賬
一致性是acid的最終追求
isolation:併發執行的事務不會相互影響
鎖機制來實現隔離性
這裡提一下幾個鎖
共享鎖:使用者可以併發的讀取資料,但任何事務都不能夠修改直至釋放所有的共享鎖
排它鎖:如果事務對資料加上排它鎖之後,其他事務不能夠在對其加上任何的鎖
獨佔鎖:和排它鎖乙個意思 但是是在myisam上面這麼叫
record lock:單個記錄上鎖
gap lock:間隙鎖 鎖定乙個範圍 不包括記錄本身
next-key lock:record+gap 鎖定乙個範圍 包括記錄本身
意向鎖:鎖行的時候檢查是否有表鎖,如果沒表鎖則加鎖成功 如果就表鎖就直接失敗 大範圍到小範圍的過程
自增鎖:就是自增id自身支援的
duration:事務一旦提交,其對資料庫的更新就是持久的。任何事務或系統故障都不會導致資料丟失
write ahead log預寫日誌保證資料->記憶體->硬碟這個過程不會因為斷電等其他因素導致資料丟失
redo log保證永續性
原子性實現的原理:undo log
undo和redo日誌是歸屬於innodb,bin是歸屬於mysql的server層
undo log是為了實現事務的原子性,這裡就是指的資料回滾,在innodb還使用 undo log來實現多版本併發控制mvcc
在操作任何資料之前,首先將資料備份到乙個地方(這個儲存資料備份的地方就是undo log)。然後進行資料的修改。如果出現了錯誤或者使用者執行了rollback語句,系統就利用undo log中的備份恢復資料
提一嘴這裡的undo log是邏輯日誌 是對資料的修改 實際的物理日誌 是對記憶體頁的修改
永續性實現原理:redo log
和undo log相反,redo log記錄的是新資料的備份。在事務提交之前,只要將redo log持久化即可,不需要將資料持久化。當系統崩潰時,雖然資料沒有持久化,但是redo log已經持久化,系統可以將所有資料恢復到最新的狀態
mysql的隔離級別
事務具有隔離性,理論上來說事務之間的執行不應該相互產生影響,其對資料庫的影響應該和他們序列執行時一樣 然而完全地隔離性會導致系統併發效能很低,降低對資源的利用率,因而實際上對隔離性的要求會有所放寬,這也會一定程度造成資料庫一致性要求降低
sql標準為事務定義了不同的隔離級別 從低到高一次是:
read-uncommitted 對事務處理的讀取沒有任何限制 引發髒讀、不可重複讀、幻讀
read-committed: 引發不可重複度、幻讀
repeatable read:(mysql預設) 引發幻讀
serializable:
髒讀:ab兩個事務a查詢到了b事務還沒提交更改的資料
不可重複讀:同乙個事務裡面讀取相同的資料查到了不同的結果
幻讀:幻讀是讀取相同的資料查到了多條不同的結果
這裡區分一下不可重複讀和幻讀
####不可重複讀和幻讀的區別####
很多人容易搞混不可重複讀和幻讀,確實這兩者有些相似。但不可重複讀重點在於update和delete,而幻讀的重點在於insert。
如果使用鎖機制來實現這兩種隔離級別,在可重複讀中,該sql第一次讀取到資料後,就將這些資料加鎖,其它事務無法修改這些資料,就可以實現可重複 讀了。但這種方法卻無法鎖住insert的資料,所以當事務a先前讀取了資料,或者修改了全部資料,事務b還是可以insert資料提交,這時事務a就會 發現莫名其妙多了一條之前沒有的資料,這就是幻讀,不能通過行鎖來避免。需要serializable隔離級別 ,讀用讀鎖,寫用寫鎖,讀鎖和寫鎖互斥,這麼做可以有效的避免幻讀、不可重複讀、髒讀等問題,但會極大的降低資料庫的併發能力。
所以說不可重複讀和幻讀最大的區別,就在於如何通過鎖機制來解決他們產生的問題。
這裡了解下mvcc
每張表 都有兩列使用者不可見的 createtime和deletetime 其中createtime是事務遞增id deletetime為空
在執行查詢的時候 會查詢開始事務createtime是<=當前事務createtime的資料 且deletetime是》=當前事務id 或是空的記錄
所以rc永遠都是讀的最新資料 而rr是讀的快照資料
innodb行鎖是通過給索引上的索引項來實現的 只有通過索引條件來檢索資料 innodb才使用行鎖 否則 innodb將使用表鎖
lock in share mode 是共享鎖
for update 是排它鎖
mysql事務與鎖機制 mysql事務與鎖機制
在併發下事務會容易出現的一些問題 資料更新丟失 兩個事務同時操作一條資料,乙個事務因為異常導致資料更新丟失 髒讀 乙個失誤開始讀取了某行資料,另外乙個事務已經更新了此資料但沒有能夠及時提交。這是相當危險的,因為很可能所有的操作都被回滾。不可重複讀 乙個事務對同一行資料重複讀取兩次,但是卻得到了不同的...
mysql事務及其鎖機制
1.事務是一條或多條資料庫操作語句的組合。四個特性 acid 原子性 隔離性 一致性 永續性。mysql 本身不提供事務支援,而是開放了儲存引擎介面,由具體的儲存引擎來實現,具體來說支援 mysql 事務的儲存引擎就是 innodb。儲存引擎實現事務的通用方式是基於 redo log 和 undo ...
MySQL事務與鎖機制
在事務的四個特點中,一致性是事務的根本追求,而在某些情況下會對事務的一致性造成破壞,如 事務的併發執行 事務故障或者系統故障 資料庫系統通過併發控制技術和日誌恢復技術來避免這種情況的發生 併發控制技術保證了事務的隔離性,使得資料庫的一致性狀態不會因為併發執行的操作而被破壞。日誌恢復技術保證了事務的原...