數據庫事務的四種隔離機制和七種傳播行爲

MySQL數據庫爲咱們提供的四種隔離級別:(依次解決髒讀、不可重複讀、幻讀)sql

  ① Serializable (串行化):可避免髒讀、不可重複讀、幻讀的發生。數據庫

  ② Repeatable read (可重複讀):可避免髒讀、不可重複讀的發生。(Mysql默認的方式)session

  ③ Read committed (讀已提交):可避免髒讀的發生。(Oracle默認的方式)併發

  ④ Read uncommitted (讀未提交):最低級別,任何狀況都沒法保證。(INNODB內部機制)atom

 

數據庫事務正常執行的四個特性:事務

ACID屬性:ci

 原子性(atomicity):即不可分割,事務要麼所有被執行,要麼所有不執行it

一致性(consistency):事務的執行使得數據庫從一種正確狀態轉換成另一種正確狀態io

隔離性(isolation):在事務正確提交以前,不容許把事務對該數據的改變提供給任何其餘事務table

持久性(durability):事務正確提交以後,其結果將永遠保存在數據庫之中,即便在事務提交以後有了其餘故障,事務的處理結果也會獲得保存

 

併發下事務產生的問題:

一、髒讀:事務A讀到了事務B尚未提交的數據;

二、不可重複讀:在一個事務裏面讀取了兩次某個數據,讀出來的數據不一致;

三、幻讀:在一個事務裏面的操做中發現了未被操做的數據。

幻讀,須要應用使用加鎖讀來保證。而這個加鎖度使用到的機制就是next-key locks。

SELECT * FROM t_bitfly LOCK IN SHARE MODE;

SELECT * FROM t_bitfly FOR UPDATE;(重複讀,看到其餘事物提交的數據)。


    

不一樣的隔離級別在數據庫中的加鎖策略不同:
    Read uncommitted - 讀不須要加鎖,寫僅僅須要加 行鎖。 
    Read committed - 須要加 寫鎖,讀必須等待寫事務結束。避免髒讀
    Repeatable reads - 須要加 讀鎖,當有事務在讀一行記錄,其餘寫同一行的事務都會阻塞。避免不可重複讀。
    Serializable - 須要加 範圍鎖,當有事務 SELECT 某個範圍的數據時,其餘訪問同一範圍的事務都會阻塞。避免幻讀。

 

 

 

Oracle數據庫中:

Serializable (串行化)級別。

Read committed (讀已提交)這兩種級別,其中默認的爲Read committed級別。

 

在MySQL數據庫中查看當前事務的隔離級別:

   select @@tx_isolation;

  在MySQL數據庫中設置事務的隔離 級別:

   set  [glogal | session]  transaction isolation level 隔離級別名稱;    set tx_isolation=’隔離級別名稱;’

 

 

事務傳播行爲類型

說明

PROPAGATION_REQUIRED

若是當前沒有事務,就新建一個事務,若是已經存在一個事務中,加入到這個事務中。這是 最多見的選擇。

PROPAGATION_SUPPORTS

支持當前事務,若是當前沒有事務,就以非事務方式執行。

PROPAGATION_MANDATORY

使用當前的事務,若是當前沒有事務,就拋出異常。

PROPAGATION_REQUIRES_NEW

新建事務,若是當前存在事務,把當前事務掛起。

PROPAGATION_NOT_SUPPORTED

以非事務方式執行操做,若是當前存在事務,就把當前事務掛起。

PROPAGATION_NEVER

以非事務方式執行,若是當前存在事務,則拋出異常。

PROPAGATION_NESTED

若是當前存在事務,則在嵌套事務內執行。若是當前沒有事務,則執行與 PROPAGATION_REQUIRED 相似的操做。

相關文章
相關標籤/搜索