spring事務和mysql的隔離級別


mysql事務、mysql隔離級別、mysql鎖、mysql數據一致性、Spring事務、Spring事務傳播性之間的關系 一直有些模糊,整理一下。
 
mysql事務:
在mysql中,只有使用了Innodb引擎的數據庫或表才支持事務
事務處理可以用來維護數據庫的完整性,保證成批的sql語句要么全部執行,要么全部不執行
事務用來管理insert,update,delete語句
事務要滿足四個條件(ACID):原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)
原子性:一個事務(transaction)中的所有操作,要么全部完成,要么全部不完成。
    事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣
一致性:在事務開始前和事務結束后,數據庫的完整性沒有被破壞。
    這表示寫入的資料必須完全符合所有的預設規則,這包含資料的精確度、串聯性以及后續數據庫可以自發性的完成預定的工作。
隔離性:數據庫允許多個並發事務同時對其數據進行讀寫和修改,隔離性可以防止多個事務並發執行時,由於交叉執行而導致數據的不一致。
    事務隔離分為不同級別, InnoDB 存儲引擎提供事務的隔離級別有:讀未提交(Read uncommitted)、讀提交(read committed)、可重復讀(repeatable read)和串行化(Serializable)
持久性:事務處理結束后,對數據的修改就是永久的,即便系統故障也不會丟失。
 
在 MySQL 命令行的默認設置下,事務都是自動提交的,即執行 SQL 語句后就會馬上執行 COMMIT 操作。因此要顯式地開啟一個事務務須使用命令 BEGIN 或 START TRANSACTION,或者執行命令 SET AUTOCOMMIT=0,用來禁止使用當前會話的自動提交。
 
SQL標准定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低級別的隔離級一般支持更高的並發處理,並擁有更低的系統開銷。
四種隔離級別和可能產生問題:
 

Read Uncommitted:所有事務都可以看到其他未提交事務的執行結果。

會導致【臟讀Drity Read】:讀了錯誤的數據。Read Uncommitted隔離級別時,b事務可以讀取另外a事務未提交的數據,如果a事務rollback,則b事務讀取的數據是錯誤的。

Read Committed:一個事務只能看見已經提交事務所做的改變。

會導致【不可重復讀Non-repeatable read】:兩次讀的某條數據不一致。Read Committed隔離級別時,在一個事務的兩次查詢之間,其他事務提交並更新了該條數據,導致兩次查詢的數據不一致。

Repeatable Read:同一個事務中多次讀取相同的數據返回的結果是一樣的。MySQL的默認事務隔離級別,一個事務在執行過程中可以看到其他事務已經提交的新插入的記錄(讀已經提交的,其實是讀早於本事務開始且已經提交的),但是不能看到其他事務對已有記錄的更新(即晚於本事務開始的),並且,該事務不要求與其他事務是“可串行化”的。

在當前事務提交之前,其它不論什么事務均不能夠改動或刪除當前事務已讀取的數據。並發性低於 READ COMMITTED。由於已讀數據的共享鎖在整個事務期間持有,而不是在每一個語句結束時釋放。

會導致【幻讀Phantom Read】:當用戶讀取某范圍數據行時,另一事務在此范圍內插入新行,當用戶再次讀取此范圍數據行時,讀取到新的幻影行。

Serializable:最高的隔離級別,它通過強制事務排序,使之不可能相互沖突,從而解決幻讀問題。簡言之,它是在每個讀的數據行上加上共享鎖。在這個級別,可能導致大量的超時現象和鎖競爭。

注意⚠️:不可重復讀重點在於update和delete,而幻讀的重點在於insert。

重點:InnoDB引擎中Repeatable Read的實現原理。  

手動測試,mysql里沒有出現幻讀的問題。

 

 

spring事務的七種隔離級別如下:

當存在一個事務時,則支持當前事務,如果沒有事務則:1、開啟新事務。2、非事務執行。3、拋出異常。

總是開啟一個新事務

總是非事務執行,如果當前事務存在:1、掛起該事務。2、拋出異常。

PROPAGATION_NESTED 如果活動事務存在,則運行在嵌套事務中,如果沒有活動事務,則安裝PROPAGATION_REQUIRED運行

 

 
 
 
 
 
 
 
 
 
 
 
 


免責聲明!

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



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