天天看點

Transaction

Transaction

原子性(Atomicity)事務必須是一個不可分割的整體,就像我們在化學課裡學到的原子,原子是構成物質的最小機關。

一緻性(Consistency)執行完資料庫操作後,資料不會被破壞。打個比方,如果從 A 賬戶轉賬到 B 賬戶,不可能因為 A 賬戶扣了錢,而 B 賬戶沒有加錢吧。

隔離性(Isolation)保證資料庫操作之間是“隔離”的(線程之間有時也要做到隔離),彼此之間沒有任何幹擾。

持久性(Durability)資料庫必須要保證有一條資料永久地存放在磁盤

這 4 條特性,是事務管理的基石,原子性是基礎,隔離性是手段,持久性是目的,最重要的就是一緻性。

Dirty Read(髒讀)事務 A 讀取了事務 B 未送出的資料,并在這個基礎上又做了其他操作。

Unrepeatable Read(不可重複讀)事務 A 讀取了事務 B 已送出的更改資料。

Phantom Read(幻讀)事務 A 讀取了事務 B 已送出的新增資料。

Transaction

擷取預設隔離級别

DatabaseMetaData meta = DBUtil.getDataSource().getConnection().getMetaData();

int defaultIsolation = meta.getDefaultTransactionIsolation();

事務傳播行為(Transaction Propagation Behavior)Spring 解決的隻是方法之間的事務傳播

假設事務從方法 A 傳播到方法 B,面對方法 B,問自己一個問題,方法 A 有事務嗎?

PROPAGATION_REQUIRED  如果沒有,就建立一個事務;如果有,就加入目前事務。Spring 提供的預設事務傳播行為,适合絕大多數情況。

RROPAGATION_REQUIRES_NEW  如果沒有,就建立一個事務;如果有,就将目前事務挂起。意思就是建立了一個新事務,它和原來的事務沒有任何關系了。

PROPAGATION_NESTED  如果沒有,就建立一個事務;如果有,就在目前事務中嵌套其他事務。當主事務送出或復原,子事務也會送出或復原。

PROPAGATION_SUPPORTS  如果沒有,就以非事務方式執行;如果有,就使用目前事務。

PROPAGATION_NOT_SUPPORTED  如果沒有,就以非事務方式執行;如果有,就将目前事務挂起。

PROPAGATION_NEVER  如果沒有,就以非事務方式執行;如果有,就抛出異常。

PROPAGATION_MANDATORY  如果沒有,就抛出異常;如果有,就使用目前事務。

事務逾時(Transaction Timeout)

為了解決事務時間太長,消耗太多的資源,是以給事務設定一個最大時長,如果超過了,就復原事務。

隻讀事務(Readonly Transaction)

為了忽略那些不需要事務的方法,比如讀取資料,這樣可以有效地提高一些性能。

 ps:

可在 @Transactional 注解中設定:事務隔離級别、事務傳播行為、事務逾時時間、是否隻讀事務。