mysql事務隔離級別和spring Transaction事務傳播
阿新 • • 發佈:2021-01-15
事務的ACID原則是什麼?
- 原子性(atomicity):最小且不可分割的。要麼都執行,要麼都不執行。
- 一致性(consistency):事務的執行使得資料庫從一種正確狀態轉換成另一種正確狀態
- 隔離型(isolation):各事務同步執行時,所獲取的資料,不受其他事務的影響。
- 永續性(durability):事務提交之後,結果永遠儲存在資料庫中。
併發下事務會產生什麼問題?
- 髒讀:事務A讀取了事務B未提交的資料。
- 不可重複讀:在同一個事務裡面讀取了兩次某個資料,但是讀出來的資料不一致。
- 幻讀:在同一個事務裡面讀取了兩次某個資料,後一次查詢到了前一次沒有查到的記錄(專指新插入的行)。
mysql事務的隔離級別有幾種?
- DEFAULT:預設隔離級別(REPEATABLE-READ)
- READ_UNCOMMITTED:讀未提交。能夠讀取到其他事務未提交的資料
- READ_COMMITTED:讀已提交。能夠讀取到其他事務已提交的資料。
- REPEATABLE_READ:重複讀。
- 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事務傳播行為有哪幾種?
- PROPAGATION_REQUITRED:如果當前沒有事務就建立一個新事務。如果當前存在事務則加入。(常用)
- PROPAGATION_NESTED:如果當前沒有事務就建立一個新事務。如果當前存在事務,則在巢狀事務內執行。
- PROPAGATION_SUPPORTS:如果當前沒有事務就已非事務執行。如果當前存在事務則加入。
- PROPAGATION_MANDATORY:如果當前沒有事務則丟擲異常。如果當前存在事務則加入。
- PROPAGATION_REQUITRED_NEW:無論當前是否存在事務,都建立新事務。
- PROPAGATION_NOT_SUPPORTED:以非事務執行。如果當前存在事務則把當前事務掛起。
- PROPAGATION_NEVER:以非事務執行。如果當前存在事務則丟擲異常。
(2)宣告式事務