資料庫之事務相關小記
阿新 • • 發佈:2018-12-13
一、事務的特性
原子性:事務中包含的邏輯,不可再分。如幾個邏輯單元加起來構成一個事務,銀行轉賬你增我減
一致性:事務執行前後,資料完整性
隔離性:事務在執行期間不應該收到其它事務的影響
永續性:事務執行成功,資料應該持久儲存到磁碟上
二、事務的安全隱患
不考慮隔離級別(@@tx_isolation 表)設定,那麼會出現一下問題(讀和寫問題)
1、髒讀
一個事務讀到另一個事務還未提交的資料。因為讀取到的是資料庫記憶體中的資料,而非真正磁碟上的資料。可開啟兩個DOS驗證。分別開啟事務進行查詢更新操作,記得設定隔離級別為“讀未提交”,隔離級別很低。
讀未提交、讀已提交
2、不可重複讀
一個事務讀到了另外一個事務提交的資料,造成了前後兩次查詢結果不一致。
重複讀
3、幻讀
一個事務讀到了另一個事務已提交的插入的資料,導致多次查詢結果不一致。
可序列化
隔離級別比較
注:可序列化隔離級別,如果有一個連線的隔離級別設定為了序列化,那麼誰先打開了事務,誰就有了先執行的權利,誰後開啟事務,就只能等著,等前面那個事務提交或者回滾後,才能執行。但是這種隔離級別一般比較少用,效能、效率低。
按效率劃分:
讀未提交 > 讀已提交 > 可重複讀 > 可序列化
按攔截程度:
可序列化 > 可重複讀 > 讀已提交 > 讀未提交
4、丟失更新
一個事務A修改名字,一個事務B修改金額,最終查詢結果是後一個事務的處理結果,那前一個事務的更新丟失。如果B提交,A名字更新失敗,如果B回滾,A更新丟失。
解決辦法:鎖
悲觀鎖:預設一定會產生“丟失更新”,所以在更新後,查詢時會加上 for update來確定更新內容
樂觀鎖:預設肯定不會產生“丟失更新”,要求程式設計師自己控制,如,加版本標識區分更新版本來達到一致性,新增欄位或者其它標識。