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:全部事務均可以看到其餘未提交事務的執行結果。mysql

會致使【髒讀Drity Read】:讀了錯誤的數據。Read Uncommitted隔離級別時,b事務能夠讀取另外a事務未提交的數據,若是a事務rollback,則b事務讀取的數據是錯誤的。spring

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

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

Repeatable Read:同一個事務中屢次讀取相同的數據返回的結果是同樣的。MySQL的默認事務隔離級別,一個事務在執行過程當中能夠看到其餘事務已經提交的新插入的記錄(讀已經提交的,實際上是讀早於本事務開始且已經提交的),可是不能看到其餘事務對已有記錄的更新(即晚於本事務開始的),而且,該事務不要求與其餘事務是「可串行化」的。併發

在當前事務提交以前,其它不論什麼事務均不可以改動或刪除當前事務已讀取的數據。併發性低於 READ COMMITTED。因爲已讀數據的共享鎖在整個事務期間持有,而不是在每個語句結束時釋放。測試

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

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

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

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

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

 

 

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

當存在一個事務時,則支持當前事務,若是沒有事務則:一、開啓新事務。二、非事務執行。三、拋出異常。

老是開啓一個新事務

老是非事務執行,若是當前事務存在:一、掛起該事務。二、拋出異常。

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

相關文章
相關標籤/搜索