1. 程式人生 > 其它 >Spring支援的常用資料庫事務傳播屬性和事務隔離級別?

Spring支援的常用資料庫事務傳播屬性和事務隔離級別?

事務傳播屬性

事務的傳播行為:一個方法執行在了一個開啟了事務的方法中時,當前方法是使用原來的事務還是開啟一個新的事務

事務的傳播行為可以由傳播屬性指定。Spring定義了7種類傳播行為。

傳播屬性 描述
REQUIRED(常用)

如果有事務在執行,當前的方法就在這個事務內執行,否則,就啟動一個新的事務,並在自己的事務內執行

REQUIRED_NEW(常用)

當前的方法必須啟動新事務,並在它自己的事務內執行.如果有事務正在執行,應該將它掛起

SUPPORTS

如果有事務在執行,當前的方法就在這個事務內執行.否則它可以不執行在事務中

NOT_SUPPORTED

當前的方法不應該執行在事務中.如果有執行的事務,將它掛起

MANDATORY

當前的方法必須執行在事務內部,如果沒有正在執行的事務,就丟擲異常

NEVER

當前的方法不應該執行在事務中.如果有執行的事務,就丟擲異常

NESTED

如果有事務在執行,當前的方法就應該在這個事務的巢狀事務內執行.否則,就啟動一-個新的事務,並在它自己的事務內執行

事務傳播屬性可以在@Transactional註解的propagation屬性中定義。

事務隔離級別

資料庫事務併發問題

假設現在有兩個事務:Transaction01和 Transaction02併發執行。

1、髒讀

①Transaction01將某條記錄的AGE值從20修改為30。
②Transaction02讀取了Transaction01更新後的值:30。
③Transaction01回滾,AGE值恢復到了20。
④Transaction02讀取到的30就是一個無效的值。

2、不可重複讀

①Transaction01讀取了AGE值為20。
②Transaction02將AGE值修改為30。
③Transaction01再次讀取AGE值為30,和第一次讀取不一致。

3、幻讀

①Transaction01讀取了STUDENT表中的一部分資料。
②Transaction02向STUDENT表中插入了新的行。
③Transaction01讀取STUDENT表時,多出了一些行。

隔離級別

資料庫系統必須具有隔離併發執行各個事務的能力,使它們不會相互影響,避免各種併發問題。一個事務與其他事務隔離的程度稱為隔離級別。SQL標準中規定了多種事務隔離級別,不同隔離級別對應不同的干擾程度﹐隔離級別越高,資料一致性就越好,但併發性越弱。

①讀未提交:READ UNCOMMITTED
  允許Transaction01讀取Transaction02未提交的修改。

②讀已提交:READ COMMITTEDJ(開發時通常使用的隔離級別)
要求Transaction01只能讀取Transaction02己提交的修改。

③可重複讀:REPEATABLE READ
確保Transaction01可以多次從一個欄位中讀取到相同的值,即 Transaction01執行期間禁止其它事務對這個欄位進行更新。

④序列化:SERIALIZABLE
確保Transaction01可以多次從一個表中讀取到相同的行,在Transaction01執行期間,禁止其它事務對這個表進行新增、更新、刪除操作。可以避免任何併發問題,但效能十分低下。

解決能力

  髒讀 不可重複讀 幻讀

READ UNCOMMITTED

READ COMMITTED

REPEATABLE READ

SERIALIZABLE

 

支援程度

  Oralce MySQL
READ UNCOMMITTED
READ COMMITTED ✓(預設)
REPEATABLE READ ✓(預設)
SERIALIZABLE