Spring 之编程式事务的简单使用

代码演示

声明式事务控制粒度比较大,所以连接对象需要经过比较长的时间才能够回收到连接池中,如果请求很多,同事方法执行比较久,有可能会导致连接池连接对象不足,请求来不及处理。此时如果又想要有事务,并且粒度不能太大,就可以使用编程式事务,而且编程式事务对分布式事务也是可以支持的。

案例1—自动提交

通过 Spring 提供的 TransactionTemplate 工具类操作事务,代码如下:

@Component
public class Person {

	@Autowired
	private TransactionTemplate template;

	public void show(String name) {
		System.out.println("Thread.currentThread().getName() = " + Thread.currentThread().getName());
		System.out.println("======>show...");

		template.execute(status-> {
			System.out.println(">>>>>>数据库操作");

			template.execute(status1 -> {
				System.out.println(">>>>>>数据库操作");
				return null;
			});


			return null;
		});
	}
}

这个事物执行完逻辑就自动提交,然后归还连接对象。把和数据库打交道的逻辑放到 execute() 逻辑中即可,

案例2—手动提交

有时候可以通过手动控制事务,下面就是借助 Spring 提供的 PlatformTransactionManager 类来手动控制事务的提交、回滚操作。TransactionStatus 类相当于是整个事务流转过程中的状态机。在声明式事务传播中有很大作用,但是编程式事务是没有传播说法的,因为执行完一段逻辑就提交。

@Component
public class Person {

	@Autowired
	private TransactionTemplate template;

	public void show() {
		PlatformTransactionManager transactionManager = template.getTransactionManager();
		TransactionDefinition definition = new DefaultTransactionDefinition();
		TransactionStatus transactionStatus = transactionManager.getTransaction(definition);

		try {
			System.out.println(">>>>>>数据库操作");
		} catch (TransactionException e) {
			transactionManager.rollback(transactionStatus);
			throw e;
		}

		transactionManager.commit(transactionStatus);
	}
}

总结

在方法中如果存在调用第三方接口时,最好不要放在事务中,调用第三方接口比较耗时,会占用连接对象比较久,造成连接对象资源匮乏。其实编程式事务在源码中还是比较受欢迎的,比如 Seta 框架就用编程式事务来实现。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring框架提供了两种事务管理方:声明事务编程事务编程事务是通过编写代码来实现事务管理的方。在Spring中,使用编程事务需要借助于事务管理器(TransactionManager)和编程事务模板(TransactionTemplate)来进行操作。 首先,你需要配置一个事务管理器,例如使用Spring提供的DataSourceTransactionManager来管理事务。然后,你可以在代码中使用TransactionTemplate来执行事务操作。 下面是一个简单的示例代码: ```java import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.support.TransactionCallback; import org.springframework.transaction.support.TransactionTemplate; public class TransactionalService { private TransactionTemplate transactionTemplate; public void setTransactionTemplate(TransactionTemplate transactionTemplate) { this.transactionTemplate = transactionTemplate; } public void performTransactionalOperation() { transactionTemplate.execute(new TransactionCallback<Void>() { public Void doInTransaction(TransactionStatus status) { try { // 执行数据库操作等业务逻辑 // 如果发生异常,可以通过调用 status.setRollbackOnly() 设置回滚 } catch (Exception e) { status.setRollbackOnly(); } return null; } }); } } ``` 在上面的示例中,通过调用transactionTemplate.execute方法来执行需要进行事务管理的业务逻辑。如果发生异常,通过调用status.setRollbackOnly()方法设置事务回滚。 编程事务相对于声明事务更加灵活,可以根据业务需要精确控制事务的边界和行为。但是编程事务的代码相对较多,容易引入冗余代码,同时也影响代码的可读性和维护性。 因此,在实际开发中,一般推荐使用声明事务来管理事务,而编程事务更适用于一些特殊情况下的事务管理需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魔道不误砍柴功

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值