1. 程式人生 > >資料庫之事務相關小記

資料庫之事務相關小記

一、事務的特性

原子性:事務中包含的邏輯,不可再分。如幾個邏輯單元加起來構成一個事務,銀行轉賬你增我減

一致性:事務執行前後,資料完整性

隔離性:事務在執行期間不應該收到其它事務的影響

永續性:事務執行成功,資料應該持久儲存到磁碟上

二、事務的安全隱患

不考慮隔離級別(@@tx_isolation 表)設定,那麼會出現一下問題(讀和寫問題)

1、髒讀

一個事務讀到另一個事務還未提交的資料。因為讀取到的是資料庫記憶體中的資料,而非真正磁碟上的資料。可開啟兩個DOS驗證。分別開啟事務進行查詢更新操作,記得設定隔離級別為“讀未提交”,隔離級別很低。

讀未提交、讀已提交

2、不可重複讀

一個事務讀到了另外一個事務提交的資料,造成了前後兩次查詢結果不一致。

重複讀

3、幻讀

一個事務讀到了另一個事務已提交的插入的資料,導致多次查詢結果不一致。

可序列化

 

隔離級別比較

注:可序列化隔離級別,如果有一個連線的隔離級別設定為了序列化,那麼誰先打開了事務,誰就有了先執行的權利,誰後開啟事務,就只能等著,等前面那個事務提交或者回滾後,才能執行。但是這種隔離級別一般比較少用,效能、效率低。

按效率劃分:

讀未提交 > 讀已提交 > 可重複讀 > 可序列化

按攔截程度:

可序列化 > 可重複讀 > 讀已提交 > 讀未提交

4、丟失更新

一個事務A修改名字,一個事務B修改金額,最終查詢結果是後一個事務的處理結果,那前一個事務的更新丟失。如果B提交,A名字更新失敗,如果B回滾,A更新丟失。

解決辦法:鎖

悲觀鎖:預設一定會產生“丟失更新”,所以在更新後,查詢時會加上 for update來確定更新內容

樂觀鎖:預設肯定不會產生“丟失更新”,要求程式設計師自己控制,如,加版本標識區分更新版本來達到一致性,新增欄位或者其它標識。