今天在工作中遇到了乙個spring事務的問題: 在service方法內需要通過執行緒去執行新增使用者積分和使用者積分日誌的情況,試了下通過@transactional宣告式事務不起作用,只能使用手動事務去控制
因此寫了這篇部落格,記錄一下這個情況,希望能幫助到大家
一、事務的重要性,相信在實際開發過程中,都有很深的了解了。但是存在乙個問題我們經常在開發的時候一般情況下都是用的註解的方式來進行事務的控制,說白了基於spring的7種事務控制方式來進行事務的之間的協調。
二、spring的7中事務傳播行為
propagation.required
代表當前方法支援當前的事務,且與呼叫者處於同一事務上下文中,回滾統一回滾(如果當前方法是被其他方法呼叫的時候,且呼叫者本身即有事務),如果沒有事務,則自己新建事務,
propagation.supports
代表當前方法支援當前的事務,且與呼叫者處於同一事務上下文中,回滾統一回滾(如果當前方法是被其他方法呼叫的時候,且呼叫者本身即有事務),如果沒有事務,則該方法在非事務的上下文中執行
propagation.mandatory
代表當前方法支援當前的事務,且與呼叫者處於同一事務上下文中,回滾統一回滾(如果當前方法是被其他方法呼叫的時候,且呼叫者本身即有事務),如果沒有事務,則丟擲異常
propagation.requires_new
建立乙個新的事務上下文,如果當前方法的呼叫者已經有了事務,則掛起呼叫者的事務,這兩個事務不處於同一上下文,如果各自發生異常,各自回滾
propagation.not_supported
該方法以非事務的狀態執行,如果呼叫該方法的呼叫者有事務則先掛起呼叫者的事務
propagation.never
該方法以非事務的狀態執行,如果呼叫者存在事務,則丟擲異常
propagation.nested
如果當前上下文中存在事務,則以巢狀事務執行該方法,也就說,這部分方法是外部方法的一部分,呼叫者回滾,則該方法回滾,但如果該方法自己發生異常,則自己回滾,不會影響外部事務,如果不存在事務,則與propagation_required一樣
三、資料庫四大特性和mysql事務的隔離級別
1)四大特性
a、原子性(atomicity)
原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾。
b、 一致性(consistency)
一致性是指事務必須使資料庫從乙個一致性狀態變換到另乙個一致性狀態,也就是說乙個事務執行之前和執行之後都必須處於一致性狀態。
c、隔離性(isolation)
隔離性是當多個使用者併發訪問資料庫時,比如操作同一張表時,資料庫為每乙個使用者開啟的事務,不能被其他事務的操作所干擾,多個併發事務之間要相互隔離。
d、 永續性(durability)
永續性是指乙個事務一旦被提交了,那麼對資料庫中的資料的改變就是永久性的,即便是在資料庫系統遇到故障的情況下也不會丟失提交事務的操作。
2)隔離級別
a、髒讀是指在乙個事務處理過程裡讀取了另乙個未提交的事務中的資料。(讀取未提交的資料)
b、不可重複讀是指在對於資料庫中的某個資料,乙個事務範圍內多次查詢卻返回了不同的資料值,這是由於在查詢間隔,被另乙個事務修改並提交了。(邊讀邊寫)
c、幻讀指兩個事務同時發生,兩個事務修改資料,讀到的資料不是自己開始修改的資料。幻讀和不可重複讀都是讀取了另一條已經提交的事務(這點就髒讀不同),所不同的是不可重複讀查詢的都是同乙個資料項,而幻讀針對的是一批資料整體。(同時寫,同時讀)
3)資料庫事務級別,預設使用repeatable read級別,列表級別從下往上級別越低。檢視級別
select @@tx_isolation;
四、扯遠了,寫上面spring事務和資料庫事務隔離級別,主要的目的就是了解事務之間存在的傳遞關係,這樣在控制的時候,spring會通過事務與事務之間關係,來達到回滾或者提交的效果。
五、如果在沒有辦法使用註解的時候(比如多執行緒等),就要使用手動的方式來做事務管理了,這也就是程式設計式的事務管理。
1)首先加入註解,這就是spring的jdbc框架中提供的事務管理方式
@autowired
private platformtransactionmanager platformtransactionmanager;
@autowired
private transactiondefinition transactiondefinition;
2)看一下原始碼(datasourcetransactionmanagerautoconfiguration.class、transactiontemplate.class)
備註:有興趣可以了解一下datasourcetransactionmanager的寫法和原理。
注意,這裡的所有事務傳播方式包括處理,都需要自己手動去處理。
3)編寫方式
transactionstatus transactionstatus = platformtransactionmanager.gettransaction(transactiondefinition);
platformtransactionmanager.commit(transactionstatus);
platformtransactionmanager.rollback(transactionstatus);
說明:這裡開發事務過後,返回乙個事務狀態,這個狀態記錄了東西,用來控制事務的管理,當然,多個事務之間的控制需要人為控制。
4)程式設計式的事務控制經量少用,因為控制程度上面來說spring的方式還是來的更加不錯,程式設計式的方式,更多用於在需要事務的時候,沒有辦法加入事務,才採取手動控制事務的方式。
使用示例 :
1 在service內注入 這兩個bean
@autowired
private platformtransactionmanager platformtransactionmanager;
@autowired
private transactiondefinition transactiondefinition;
2在 service方法內建立transactionstatus
transactionstatus transactionstatus = platformtransactionmanager.
gettransaction
(transactiondefinition)
;通過 platformtransactionmanager.
commit
(transactionstatus)
; 提交事務
通過 platformtransactionmanager.
rollback
(transactionstatus)
; 回滾事務
示例**:
@autowired
private platformtransactionmanager platformtransactionmanager;
@autowired
private transactiondefinition transactiondefinition;
public
voidb(
)
Springboot事務手動回滾或提交
service層的方法被controller層呼叫時,在方法上加 transactional註解,運算元據庫時會有事務。transactional public void insert catch exception e 正常流程下事務會自動提交,異常情形需要開發人員手動處理 情景一 異常捕獲後事務...
kafka手動提交與自動提交
kafka的提交分為手動提交和自動提交 自動提交 kafka enable auto commit 手動提交 enable auto commit bean public mapconsumerconfigs 獲取kafka手動提交的配置 return map bean public mapcons...
spring手動提交事務
spring手動提交事務 宋虎spring 手動提交事務 手動事務提交比使用宣告性事務管理器多乙個配置,就是通知,因為在通知中增加的事務。1.步驟 第一步 定義介面 第二步 真實物件實現介面 第三步 dao 物件,使用資料來源 第四步 po物件 第五步 通知,手動處理事務 該類中使用資料來源連線 d...