1. 程式人生 > 資料庫 >mysql事務隔離級別和spring Transaction事務傳播

mysql事務隔離級別和spring Transaction事務傳播

事務的ACID原則是什麼?

  1. 原子性(atomicity):最小且不可分割的。要麼都執行,要麼都不執行。
  2. 一致性(consistency):事務的執行使得資料庫從一種正確狀態轉換成另一種正確狀態
  3. 隔離型(isolation):各事務同步執行時,所獲取的資料,不受其他事務的影響。
  4. 永續性(durability):事務提交之後,結果永遠儲存在資料庫中。

併發下事務會產生什麼問題?

  1. 髒讀:事務A讀取了事務B未提交的資料。
  2. 不可重複讀:在同一個事務裡面讀取了兩次某個資料,但是讀出來的資料不一致。
  3. 幻讀:在同一個事務裡面讀取了兩次某個資料,後一次查詢到了前一次沒有查到的記錄(專指新插入的行)。

mysql事務的隔離級別有幾種?

  1. DEFAULT:預設隔離級別(REPEATABLE-READ)
  2. READ_UNCOMMITTED:讀未提交。能夠讀取到其他事務未提交的資料
  3. READ_COMMITTED:讀已提交。能夠讀取到其他事務已提交的資料。
  4. REPEATABLE_READ:重複讀。
  5. SERLALIZABLE:序列化。不管多少事務挨個執行。

mysql查詢隔離級別:

1.檢視當前會話隔離級別

select @@tx_isolation;(mysql版本 8.0 之前)

select @@transaction_isolation (mysql版本 8.0 以後)

2.檢視系統當前隔離級別

select @@global.tx_isolation;

3.設定當前會話隔離級別

set session transaction isolatin level repeatable read;(引數可以為:Read uncommitted|Read committed|Repeatable read|Serializable))

只對當前會話有效

4.設定系統當前隔離級別

set global transaction isolation level repeatable read;

此後所有的會話有效,當前已經存在的會話不受影響

spring Transaction事務傳播行為有哪幾種?

  1. PROPAGATION_REQUITRED:如果當前沒有事務就建立一個新事務。如果當前存在事務則加入。(常用)
  2. PROPAGATION_NESTED:如果當前沒有事務就建立一個新事務。如果當前存在事務,則在巢狀事務內執行。
  3. PROPAGATION_SUPPORTS:如果當前沒有事務就已非事務執行。如果當前存在事務則加入。
  4. PROPAGATION_MANDATORY:如果當前沒有事務則丟擲異常。如果當前存在事務則加入。
  5. PROPAGATION_REQUITRED_NEW:無論當前是否存在事務,都建立新事務。
  6. PROPAGATION_NOT_SUPPORTED:以非事務執行。如果當前存在事務則把當前事務掛起。
  7. PROPAGATION_NEVER:以非事務執行。如果當前存在事務則丟擲異常。

 

(2)宣告式事務