事務的隔離級別,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,這就是所謂的幻讀。