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 相似的操做。 |