事務的隔離級別,mysql中開啟事務、django中開啟事務
- 2020 年 3 月 17 日
- 筆記
目錄
一、事務的特性
A.原子性 atomicity :不可分割,要麼都做,要麼都不做。 C.一致性 consistency :資料庫從一個一致性狀態變到另一個一致性狀態,一致性與原子性是密切相關(總量不變) I:隔離性 isolation :一個事務的執行不能被其他事務干擾 D:持久性 durability :永久性,事務一旦提交,就已經改變了資料庫中的數據。不可回滾
二、資料庫中開啟事務
1.# 修改數據之前先開啟事務操作 start transaction; 2.# 修改操作 sql語句 3.# 回滾到上一個狀態,未保存。數據在記憶體中 rollback; 4.# 開啟事務之後,只要沒有執行commit操作,數據其實都沒有真正刷新到硬碟 commit; # 相當於保存,數據刷到硬碟
三、Django中開啟事務的兩種方式
第一種
from django.db import transaction with transaction.atomic(): ...
第二種
from django.db import transaction @transaction.atomic def post(self,request): ... sid=transaction.savepoint() #開啟事務 ... transaction.savepoint_rollback(sid) # 回滾 ... transaction.savepoint_commit(sid) # 提交
四、事務的隔離級別
隔離級別
read uncommited (可讀未提交,臟讀):不做任何隔離,具有臟讀,不可重讀對,幻讀的問題 read committed (讀提交,不可重複讀):可以防止臟讀,不能放在不可重複讀和幻讀的問題 repeated read(可重複讀,可重複讀):可以防止臟讀,不可重複讀,不能放在幻讀(mysql的默認隔離級別) serializable(串列化,幻讀):資料庫運行為串列,以上問題都可以防止,但是性能低
事務隔離級別 | 臟讀 | 不可重複讀 | 幻讀 |
---|---|---|---|
讀未提交(read-uncommitted) | 是 | 是 | 是 |
不可重複讀(read-committed) | 否 | 是 | 是 |
可重複讀(repeatable-read) | 否 | 否 | 是 |
串列化(serializable) | 否 | 否 | 否 |
**1、臟讀:事務A讀取了事務B更新的數據,然後B回滾操作,那麼A讀取到的數據是臟數據** **2、不可重複讀:事務 A 多次讀取同一數據,事務 B 在事務A多次讀取的過程中,對數據作了更新並提交,導致事務A多次讀取同一數據時,結果 不一致。** **3、幻讀:系統管理員A將資料庫中所有學生的成績從具體分數改為ABCDE等級,但是系統管理員B就在這個時候插入了一條具體分數的記錄,當系統管理員A改結束後發現還有一條記錄沒有改過來,就好像發生了幻覺一樣,這就叫幻讀。** **小結:不可重複讀的和幻讀很容易混淆,不可重複讀側重於修改,幻讀側重於新增或刪除。解決不可重複讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表** ### read uncommited(可讀未提交,臟讀)
如何查看mysql隔離級別?
select @@global.tx_isolation;
修改事務的隔離級別
#修改配置文件 transaction-isolation=Read-Committed #修改後一定要重啟資料庫
隔離級別解釋
下面的解釋都用這個user表
name | age |
---|---|
jeff | 38 |
read uncommited (可讀未提交,臟讀)
臟讀(兩個事務都是存活的)
1 a 開啟事務 將jeff的年齡改成 18歲,但是沒有提交事務 2 b 開始事務 讀取jeff的年齡,發現是18歲。 上述的問題, 假設a事務回滾,b事務使用的數據就是錯誤的,就導致程式數據不正確。
read committed(讀提交,不可重複讀)
不可重複度(兩個事務都是存活的)
1 a 開始事務 將jeff的年齡改成18歲,但是提交了 2 b 開啟事務 讀取jeff的年齡就能讀取a事務修改後的jeff年齡18歲。 上述的問題, 只能讀提交後的數據,事務a事先讀取了數據,事務b緊接著更新了數據,並提交了事務,而事務a再次讀取該數據時,數據已經發生了改變。
repeated read(可重複讀,可重複讀)
可重讀讀(兩個事務都是存活的)
1 a 開始事務 將jeff的年齡改成18歲,但是提交了 2 b 開啟事務 讀取jeff的年齡不能讀取a事務修改後的jeff年齡18歲。而是讀取的是38歲
serializable(串列化,幻讀)
幻讀(兩個事務都是存活的)
#概念和不可重讀有點像,不可重複度是站在修改的基礎上,而幻讀是站在新增的基礎上 1 a 開始事務 將所有的的年齡改成18歲 2 b 開始事務 新增一條數據數據name=tank,age=19,而且提交了。 3 a 重新查, 發現有一條數據 的age=19,這就是所謂的幻讀。