一、事務概念
事務是指作為單個邏輯工作單元執行的一系列操作,所有操作要麼全部成功完成,要麼全部失敗而回滾。在關係型數據庫中,事務通常是指一系列的數據操作,比如增刪改查等。
二、Spring事務管理器
Spring事務管理器是Spring框架提供的一個事務管理的通用接口。Spring事務管理器可以與多種事務管理機制進行集成,包括JDBC事務、JTA事務和Hibernate事務等。
@Configuration
@EnableTransactionManagement
public class AppConfig {
@Bean
public DataSource dataSource() {
// 創建數據源
}
@Bean
public PlatformTransactionManager transactionManager() {
return new DataSourceTransactionManager(dataSource());
}
}
三、Spring事務傳播機制
Spring事務傳播機制是指在多個事務方法調用的嵌套情況下,事務如何進行傳播。
1、REQUIRED
REQUIRED是Spring默認的事務傳播機制。該機制會在當前事務不存在時,創建一個新的事務並在當前事務中執行。在當前事務中調用其他方法時,調用的方法將在當前事務中執行。
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
// do something
methodB();
}
@Transactional(propagation = Propagation.REQUIRED)
public void methodB() {
// do something
}
2、SUPPORTS
SUPPORTS是指當前調用方法如果已經在事務中,則直接加入該事務,否則以非事務的方式執行。如果調用的方法沒有事務,則當前方法也不會創建事務,以非事務的方式執行。
@Transactional(propagation = Propagation.SUPPORTS)
public void methodA() {
// do something
methodB();
}
@Transactional(propagation = Propagation.SUPPORTS)
public void methodB() {
// do something
}
3、MANDATORY
MANDATORY是指當前調用方法必須在一個事務中運行,否則將拋出異常。
@Transactional(propagation = Propagation.MANDATORY)
public void methodA() {
// do something
methodB();
}
@Transactional(propagation = Propagation.MANDATORY)
public void methodB() {
// do something
}
4、REQUIRES_NEW
REQUIRES_NEW是指當前調用方法必須啟動一個新的事務,並在該事務中運行。如果當前存在事務,則將當前事務掛起並創建一個新的事務執行。
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodA() {
// do something
methodB();
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodB() {
// do something
}
5、NOT_SUPPORTED
NOT_SUPPORTED是指當前調用方法不應該在事務中運行。如果當前存在事務,則將該事務掛起並以非事務的方式執行該方法。
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void methodA() {
// do something
methodB();
}
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void methodB() {
// do something
}
6、NEVER
NEVER是指當前調用方法不應該在事務中運行。如果當前存在事務,則拋出異常。
@Transactional(propagation = Propagation.NEVER)
public void methodA() {
// do something
methodB();
}
@Transactional(propagation = Propagation.NEVER)
public void methodB() {
// do something
}
7、NESTED
NESTED是指當前調用方法應該在一個嵌套事務中執行。如果當前不存在事務,則與REQUIRED傳播機制相同。如果當前存在事務,則在該事務的嵌套事務中執行。
@Transactional(propagation = Propagation.NESTED)
public void methodA() {
// do something
methodB();
}
@Transactional(propagation = Propagation.NESTED)
public void methodB() {
// do something
}
四、總結
Spring事務傳播機制是Spring框架重要的一部分。在實際開發中,應該根據實際情況選擇合適的事務傳播機制,以保證事務的正確性和完整性。
原創文章,作者:YEPQW,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/370135.html