SpringBoot中手動(dòng)開啟事務(wù)的實(shí)現(xiàn)方法
在Spring Boot中,雖然大多數(shù)情況下推薦使用@Transactional注解來管理事務(wù),但有時(shí)需要更靈活地手動(dòng)控制事務(wù)。這可以通過TransactionTemplate或PlatformTransactionManager來實(shí)現(xiàn)
一、使用 TransactionTemplate
TransactionTemplate是Spring提供的一個(gè)模板類,用于簡化事務(wù)管理。
1、配置 TransactionTemplate
(首先,確保你的項(xiàng)目已經(jīng)配置了數(shù)據(jù)源和事務(wù)管理器(Spring Boot通常會(huì)自動(dòng)配置這些))。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.support.TransactionTemplate;
@Configuration
public class TransactionConfig {
@Bean
public TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager) {
return new TransactionTemplate(transactionManager);
}
}2、使用 TransactionTemplate
在需要手動(dòng)管理事務(wù)的服務(wù)類中注入并使用TransactionTemplate:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate;
@Service
public class MyService {
@Autowired
private TransactionTemplate transactionTemplate;
public void saveData() {
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(org.springframework.transaction.TransactionStatus status) {
try {
// 偽代碼
// myRepository.save(new MyEntity("Data 1"));
// myRepository.save(new MyEntity("Data 2"));
// Simulate an exception to trigger a rollback
if (true) {
throw new RuntimeException("Simulated exception");
}
// myRepository.save(new MyEntity("Data 3"));
} catch (RuntimeException e) {
// Rollback transaction if exception occurs
status.setRollbackOnly();
throw e;
}
}
});
}
}二、使用 PlatformTransactionManager 直接管理事務(wù)
PlatformTransactionManager接口提供了更細(xì)粒度的事務(wù)控制,適用于需要復(fù)雜事務(wù)管理的場景。
1、注入 PlatformTransactionManager
在需要手動(dòng)管理事務(wù)的服務(wù)類中注入PlatformTransactionManager:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
@Service
public class MyService {
@Autowired
private PlatformTransactionManager transactionManager;
public void performTransactionalOperation() {
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setName("myTransaction");
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus status = transactionManager.getTransaction(def);
try {
// Perform database operations here
// myRepository.save(new MyEntity("Data 1"));
// myRepository.save(new MyEntity("Data 2"));
// Simulate an exception to trigger a rollback
if (true) {
throw new RuntimeException("Simulated exception");
}
// myRepository.save(new MyEntity("Data 3"));
// Commit transaction
transactionManager.commit(status);
} catch (RuntimeException e) {
transactionManager.rollback(status);
throw e;
}
}
}到此這篇關(guān)于SpringBoot中手動(dòng)開啟事務(wù)的實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)SpringBoot手動(dòng)開啟事務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java線性表的存儲(chǔ)結(jié)構(gòu)及其代碼實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Java數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)筆記第一篇,線性表的存儲(chǔ)結(jié)構(gòu)及其代碼實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09
Spring AOP結(jié)合注解實(shí)現(xiàn)接口層操作日志記錄
在項(xiàng)目開發(fā)中我們需要記錄接口的操作日志:包含請(qǐng)求參數(shù)、響應(yīng)參數(shù)、接口所屬模塊、接口功能描述、請(qǐng)求地址、ip地址等信息;實(shí)現(xiàn)思路很簡單就是基于注解和aop的方式去記錄日志,主要的難點(diǎn)在于日志表結(jié)構(gòu)、注解的設(shè)計(jì)已經(jīng)aop實(shí)現(xiàn)的一些比較好的實(shí)現(xiàn)方式的借鑒2022-08-08
詳解如何將Spring Boot應(yīng)用跑在Docker容器中
這篇文章主要介紹了詳解如何將Spring Boot應(yīng)用跑在Docker容器中,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
Spring循環(huán)依賴正確性及Bean注入的順序關(guān)系詳解
這篇文章主要給大家介紹了關(guān)于Spring循環(huán)依賴的正確性,以及Bean注入的順序關(guān)系的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01
Java中static與instance的區(qū)別及作用詳解
這篇文章主要為大家介紹了Java中static與instance的區(qū)別及作用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
java:找不到符號(hào)報(bào)錯(cuò)的排錯(cuò)方案舉例
當(dāng)你使用一個(gè)未定義或未導(dǎo)入的類時(shí),編譯器會(huì)報(bào)錯(cuò),下面這篇文章主要給大家介紹了關(guān)于java:找不到符號(hào)報(bào)錯(cuò)的排錯(cuò)方案,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01

