transactional手动提交事务_Spring都推荐用@Transactional为啥我不建议

本文探讨了Spring的声明式事务和编程式事务的优缺点。尽管声明式事务简化了代码,但其粒度问题可能导致数据不一致和数据库连接耗尽。此外,错误配置可能导致事务失效。作者建议在考虑事务管理时,应谨慎使用声明式事务,以免出现潜在问题。
摘要由CSDN通过智能技术生成

事务管理在系统开发中是不可缺少的一部分,Spring提供了很好事务管理机制,主要分为编程式事务和声明式事务两种。

关于事务的基础知识,如什么是事务,数据库事务以及Spring事务的ACID、隔离级别、传播机制、行为等,就不在这篇文章中详细介绍了。默认大家都有一定的了解。

本文,作者会先简单介绍下什么是声明式事务和编程式事务,再说一下为什么我不建议使用声明式事务。

编程式事务

基于底层的API,如PlatformTransactionManager、TransactionDefinition 和 TransactionTemplate 等核心接口,开发者完全可以通过编程的方式来进行事务管理。

编程式事务方式需要是开发者在代码中手动的管理事务的开启、提交、回滚等操作。

public void test() {      TransactionDefinition def = new DefaultTransactionDefinition();      TransactionStatus status = transactionManager.getTransaction(def);       try {         // 事务操作         // 事务提交         transactionManager.commit(status);      } catch (DataAccessException e) {         // 事务提交         transactionManager.rollback(status);         throw e;      }}

如以上代码,开发者可以通过API自己控制事务。

声明式事务

在Java中,使用@Transactional注解可以将一段代码标记为一个事务。当使用@Transactional注解时,事务提交和回滚通常是由底层的事务管理器自动处理的,而不需要手动提交。 然而,如果你希望在使用@Transactional注解的方法中手动提交事务,你可以通过以下步骤来实现: 1. 确保你的项目中已经配置了事务管理器。通常情况下,Spring框架会提供一个事务管理器(例如DataSourceTransactionManager),你需要将其配置在你的应用程序上下文中。 2. 在需要手动提交事务的方法上添加@Transactional注解。 3. 在方法的实现中,获取事务对象,并调用其commit()方法来手动提交事务。可以使用Spring的TransactionTemplate或者直接使用底层的事务管理器来获取事务对象。 以下是一个示例代码: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.stereotype.Service; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.annotation.Transactional; @Service public class MyService { @Autowired private DataSourceTransactionManager transactionManager; @Transactional public void myMethod() { // 业务逻辑 // 获取事务对象 TransactionStatus transactionStatus = transactionManager.getTransaction(null); try { // 手动提交事务 transactionManager.commit(transactionStatus); } catch (Exception e) { // 处理异常并回滚事务 transactionManager.rollback(transactionStatus); throw e; } } } ``` 在上面的示例中,@Transactional注解标记了myMethod()方法,表示该方法是一个事务。在方法的实现中,我们首先通过transactionManager.getTransaction(null)方法获取事务对象。然后,在try-catch块中,我们可以根据业务逻辑的需要,手动提交事务或者回滚事务。如果出现异常,我们在catch块中调用transactionManager.rollback(transactionStatus)来回滚事务。 请注意,手动提交事务可能会破坏Spring框架对事务的一些自动化处理,因此在使用@Transactional注解时,通常不需要手动提交事务。只有在特殊情况下才需要手动提交事务,例如需要在事务中执行一些非标准的操作或者与外部资源进行交互。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值