使用TransactionTemplate进行编程式事务管理
org.springframework.transaction.support.TransactionTemplate对与PlatformTransactionManager相关的事务界定操作以及相关的异常处理进行了模板化封装, 开发人员更多的关注于通过相应的callback接口提供具体的事务界定内容即可。spring针对TransactionTemplate提供了两个callback接口,TransactionCallback和TransactionCallbackWithoutResult,二者的唯一区别就是是否需要返回执行结果。
使用TransactionTemplate进行事务管理的代码看起来要比直接使用PlatformTransactionManager要简洁并且容易管理的多:
TransactionTemplate txTemplate = ...;
Object result = txTemplate.execute(new TransactionCallback(){
public Object doInTransaction(TransactionStatus txStatus) {
Object result = null;
// 各种事务操作 ...
return result;
}});
或者
txTemplate.execute(new TransactionCallbackWithoutResult(){
@Override
protected void doInTransactionWithoutResult(TransactionStatus txStatus) {
// 事务操作1
// 事务操作2
// ...
}});
TransactionTemplate会捕捉TransactionCallback或者TransactionCallbackWithoutResult事务操作中抛出的“unchecked exception”并回滚事务,然后将“unchecked exception”抛给上层处理, 所以,现在我们只需要处理特定于应用程序的异常即可,而不用像直接使用PlatformTransactionManager那样对所有可能的异常都进行处理。
如果事务处理期间没有任何问题,TransactionTemplate最终会为我们提交事务,唯一需要我们干预的就只剩下某些情况下的事务回滚了。 如果在TransactionCallback或者TransactionCallbackWithoutResult的事务操作过程中需要让当前事务回滚而不是最终提交,一般来说,我们有两种方式:
抛出“unchecked exception”,TransactionTemplate会为我们处理事务的回滚。 如果事务操作中可能抛出“checked exception”,这种情况下就得在callback内部捕获,然后转译为“unchecked exception”后抛出。
txTemplate.execute(new TransactionCallbackWithoutResult(){
@Override
protected void doInTransactionWithoutResult(TransactionStatus txStatus) {
try
{
...
}
catch(CheckedException e)
{
// throw specific exception here, avoid generic RuntimeException
throw new RuntimeException(e);
}
}});
使用callback接口暴露的TransactionStatus将事务标记为rollBackOnly,TransactionTemplate在最终提交事务的时候如果检测到rollBackOnly标志状态被设置,将把提交事务改为回滚事务:
txTemplate.execute(new TransactionCallbackWithoutResult(){
@Override
protected void doInTransactionWithoutResult(TransactionStatus txStatus) {
boolean needRollback = false;
...
if(needRollback)
txStatus.setRollbackOnly();
}});
对于将事务操作中可能抛出的“checked exception”,如果既想回滚事务又不想让它以“unchecked exception”的形式向上层传播的话, 我们当然不能通过将其转译成“unchecked exception”的方式来处理啦,不过我们现在却可以通过TransactionStatus设置rollBackOnly:
txTemplate.execute(new TransactionCallbackWithoutResult(){
@Override
protected void doInTransactionWithoutResult(TransactionStatus txStatus) {
try
{
...
}
catch(CheckedException e)
{
logger.warn("Tranaction is Rolled back!",e);
txStatus.setRollbackOnly();
}
}});
这种情况下需要注意一个问题,千万不要只“txStatus.setRollbackOnly()”而忘记记录日志,虽然大家可能都知道“swallow exception”是不对的, 但这个地方确实容易忽略日志的记录,从而造成事务回滚了,而我们却不知道的情况。 当发现数据库中本来应该删除的数据却依然存在,并且日志中也没有任何异常信息的时候,你就得挠脑袋很长时间来发现到底哪里出了问题了,程序没跑?才怪!
使用TransactionTemplate虽然要比直接使用PlatformTransactionManager更加便捷,但TransactionTemplate无法处理当事务操作中需要向上层抛出原来的“checked exception”的情况, 你应该也发现了,实际上TransactionCallback或者TransactionCallbackWithoutResult的方法定义中没有声明可以抛出任何“checked exception”,直接使用PlatformTransactionManager则没有这样的限制。 不过,这应该并不会过多的限制TransactionTemplate展现其“个人魅力”吧?!
分享到:
相关推荐
Spring事务管理的目的是确保数据的一致性和完整性,尤其是在多操作、多资源的环境中。本Demo将深入探讨Spring如何实现事务的管理。 首先,Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。 ...
Spring提供了两种主要的事务管理方式:声明式事务管理和编程式事务管理。本篇文章将聚焦于编程式事务管理,特别是如何通过`TransactionTemplate`进行事务控制。 1. **Spring编程式事务管理**: 编程式事务管理允许...
### Spring事务与数据库操作 #### 一、Spring的声明式事务管理 在现代软件开发中,事务处理是非常关键的一部分,特别是在涉及多个数据操作时。Spring框架提供了强大的事务管理能力,可以方便地集成到应用程序中。...
Spring事务管理是Spring框架的核心特性之一,主要用于处理应用程序中的数据一致性问题。在Spring中,事务管理分为编程式和声明式两种方式。本篇文章将详细解释Spring事务管理的流程,以及如何通过时序图来理解这一...
本文将全面分析Spring中的编程式事务管理和声明式事务管理,旨在帮助开发者深入理解这两种事务管理方式,并在实际项目中合理选择。 **编程式事务管理** 编程式事务管理是通过代码直接控制事务的开始、提交、回滚等...
Spring 声明式事务和Spring 编程式事务
Spring事务原理和配置 Spring事务原理是指Spring框架中的一种机制,用于管理事务,并提供了多种配置方式。事务是指一系列的操作,作为一个整体执行,如果其中某个操作失败,整个事务将回滚。Spring事务原理围绕着两...
本资源包提供了进行Spring事务管理开发所需的所有关键库,包括框架基础、核心组件、AOP(面向切面编程)支持、日志处理、编译工具以及与数据库交互的相关jar包。下面将对这些知识点进行详细解释: 1. **Spring框架*...
Spring 声明事务、编程事务实现 Spring 声明事务是指使用 Spring 框架来管理事务,实现事务控制。声明式事务管理是建立在 AOP 之上的,它的本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务...
总结来说,`Spring_tx编程式事务代码`主要涉及Spring的`TransactionTemplate`类,它是Spring事务管理的一种便捷工具,可以帮助开发者以编程的方式更加方便地控制事务的生命周期,同时保持代码的简洁和可维护性。...
本主题将深入探讨“Spring事务案例分析.zip”中的关键知识点,包括Spring事务管理及其在实际项目中的应用。 首先,我们来了解什么是Spring事务管理。在分布式系统或数据库操作中,事务管理是确保数据一致性和完整性...
首先,Spring事务管理是Spring框架的核心特性之一,它允许我们以声明式或编程式的方式管理事务。声明式事务管理通过配置元数据(如XML或注解)来定义事务边界,而编程式事务管理则是在代码中显式调用...
Spring事务管理分为编程式事务管理和声明式事务管理两种方式。编程式事务管理通过使用PlatformTransactionManager接口的begin、commit、rollback等方法直接控制事务的生命周期,这种方式灵活但容易导致代码过于繁琐...
本文将深入探讨在Spring框架中如何管理事务,以“Spring 事务简单完整例子”为出发点,结合标签“spring,事务,jdbc事务”,我们将详细解释Spring事务管理的原理和实践。 首先,Spring提供了两种事务管理方式:编程...
总结来说,"spring事务操作试验"涵盖了Spring框架中的事务管理基础,包括声明式和编程式事务,以及它们在JDBC操作中的应用。通过实验,读者可以更好地理解事务的生命周期、隔离级别和回滚规则,这些都是构建健壮、...
在Spring框架中,事务管理是核心特性之一,它允许开发者以声明式或编程式的方式处理事务。本示例“spring 事务传播 demo”将聚焦于Spring的事务传播行为,这是在多个方法调用中控制事务边界的关键概念。下面我们将...
在Java中,Spring框架提供了强大而灵活的支持,使得开发人员能够轻松地实现基于Java消息服务(JMS)的网络编程。JMS是一个标准接口,它允许应用程序创建、发送、接收和读取消息,这些消息可以在不同的应用之间传递,...
标题“Spring事务管理失效原因汇总”指出了本文的核心内容是分析在使用Spring框架进行事务管理时可能遇到的问题及其原因。描述部分进一步说明了事务失效的后果往往不明显,容易在测试环节被忽略,但在生产环境中出现...
本教程将深入探讨 Spring 的编程式事务管理和声明式事务管理,帮助你理解这两种方式的差异与应用场景。 首先,编程式事务管理依赖于编程的方式显式地控制事务的开始、提交、回滚等操作。它通过实现 `...