數據庫的隔離級別


事務並發運行的問題介紹
●對於同時運行的多個事務,當這些事務訪問數據庫中相同的數據時,如果沒有采取必要的隔離機制,就會導致各種並發問題:

  ➢ 臟讀:對於兩個事務T1,T2,T1讀取了已經被T2更新但還沒有被提交的字段.之后,若T2回滾,T1讀取的內容就是臨時且無效的.

  ➢ 不可重復讀:對於兩個事務T1, T2, T1讀取了一個字段,然后T2更新了該字段之后,T1再次讀取同一個字段,值就不同了,

  ➢ 幻讀:對於兩個事務T1,T2,T1從一個表中讀取了一個字段,然后T2在該表中插入了一些新的行.之后,如果T1再次讀取同一個表,就會多出幾行

數據庫事務的隔離性 :數據庫系統必須具有隔離並發運行各個事務的能力,使它們不會相互影響,避免各種並發問題.
 
●一個事務與其他事務隔離的程度稱為隔離級別,數據庫規定了多種事務隔離級別,不同隔離級別對應不同的干擾程度, 隔離級別越高,數據一致性就越好,但並發性越弱.
  
利用事務隔離級別解決上述三種問題

➢數據庫提供的4種事務隔離級別:

  READ UNCOMMITTED(讀未提交數據)       允許事務讀取未被其他事物提交的變更臟讀,不可重復讀和幻讀的問題都會出現

  READ COMMITED(讀已提交數據)    只允許事務讀取已經被其它事務提交的變更,可以避免臟讀. 但不可重復讀和幻讀問題仍然可能出現

  REPEATABLE READ(可重復讀)       確保事務可以多次從一個字段中讀取相同的值.在這個事務持續期問,禁止其他事物對這個字段進行更新.可以避免臟讀和不可重復讀,但幻讀的問題仍然存在.

  SERIALIZABLE(串 行化)           確保事務可以從一個表中讀取相同的行在這個事務持續期間,禁止其他事務對該表執行插入,更新和刪除操作.所有並發問題都可以避免,但性能十分低下.

➢Oracle支持的2種事務隔離級別: READ COMMITED,SERIALIZABLE。Oracle默認的事務隔離級別為:READ COMMITED

➢Mysql支持4種事務隔離級別.Mysql默認的事務隔離級別為: REPEATABLE READ

一些相關的sql命令
➢查看隔離級別
select @@tx_isolation;      # @@transaction_isolation 為在mysql 5.7的別名
select @@transaction_isolation; # mysql 8.0的話,第一個被棄用了,需要用第二個

 

➢設置隔離級別

set session transaction isolation level 隔離級別;  #設置當前的事務的隔離級別
set global transaction isolation level 隔離級別;   #設置全局的事務的隔離級別
#session和global  可以不寫,默認為session

 

 

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM