
原子性(Atomicity)事務必須是一個不可分割的整體,就像我們在化學課裡學到的原子,原子是構成物質的最小機關。
一緻性(Consistency)執行完資料庫操作後,資料不會被破壞。打個比方,如果從 A 賬戶轉賬到 B 賬戶,不可能因為 A 賬戶扣了錢,而 B 賬戶沒有加錢吧。
隔離性(Isolation)保證資料庫操作之間是“隔離”的(線程之間有時也要做到隔離),彼此之間沒有任何幹擾。
持久性(Durability)資料庫必須要保證有一條資料永久地存放在磁盤
這 4 條特性,是事務管理的基石,原子性是基礎,隔離性是手段,持久性是目的,最重要的就是一緻性。
Dirty Read(髒讀)事務 A 讀取了事務 B 未送出的資料,并在這個基礎上又做了其他操作。
Unrepeatable Read(不可重複讀)事務 A 讀取了事務 B 已送出的更改資料。
Phantom Read(幻讀)事務 A 讀取了事務 B 已送出的新增資料。
擷取預設隔離級别
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 注解中設定:事務隔離級别、事務傳播行為、事務逾時時間、是否隻讀事務。