使用 TransactionTemplate 绝对会增加你的代码与Spring的事务框架和API间的耦合。 到底编程式事务管理是不是适合你的项目需要由你自己来决定。
应用的代码必须在一个事务性的上下文中执行,这样就会像这样一样显式的使用TransactionTemplate。你作为一个应用程序员, 会写一个 TransactionCallback 的实现, (通常会用匿名类来实现 )这样的实现会包含所以你需要在该事务上下文中执行的代码。 然后你会把一个你自己实现TransactionCallback的实例传递给TransactionTemplate暴露的execute(..) 方法。
public class SimpleService implements Service {
// single TransactionTemplate shared amongst all methods in this instance
private final TransactionTemplate transactionTemplate;
// use constructor-injection to supply the PlatformTransactionManager
public SimpleService(PlatformTransactionManager transactionManager) {
Assert.notNull(transactionManager, "The 'transactionManager' argument must not be null.");
this.transactionTemplate = new TransactionTemplate(transactionManager);
}
public Object someServiceMethod() {
return transactionTemplate.execute(new TransactionCallback() {
// the code in this method executes in a transactional context
public Object doInTransaction(TransactionStatus status) {
updateOperation1();
return resultOfUpdateOperation2();
}
});
}
}
如果不需要返回值,更方便的方式是创建一个 TransactionCallbackWithoutResult
的匿名类,如下:
transactionTemplate.execute(new TransactionCallbackWithoutResult
() {
protected void doInTransactionWithoutResult(TransactionStatus status) {
updateOperation1();
updateOperation2();
}
});
回调方法内的代码可以通过调用 TransactionStatus
对象的 setRollbackOnly()
方法来回滚事务。
诸如传播模式、隔离等级、超时等等的事务设置都可以在TransactionTemplate
中或者通过配置或者编程式地实现。
TransactionTemplate
实例默认继承了默认事务设置
。
下面有个编程式的为一个特定的TransactionTemplate
定制事务设置的例子。
public class SimpleService implements Service {
private final TransactionTemplate transactionTemplate;
public SimpleService(PlatformTransactionManager transactionManager) {
Assert.notNull(transactionManager, "The 'transactionManager' argument must not be null.");
this.transactionTemplate = new TransactionTemplate(transactionManager);
// the transaction settings can be set here explicitly if so desired
this.transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_READ_UNCOMMITTED);
this.transactionTemplate.setTimeout(30); // 30 seconds
// and so forth...
}
}
在下面的例子中,我们将会演示如何使用Spring XML配置来定制TransactionTemplate
的事务属性。 sharedTransactionTemplate
可以被注入到所有需要的服务中去。
<bean id="sharedTransactionTemplate"
class="org.springframework.transaction.support.TransactionTemplate">
<property name="isolationLevelName" value="ISOLATION_READ_UNCOMMITTED"/>
<property name="timeout" value="30"/>
</bean>"
最后,TransactionTemplate
类的实例是线程安全的,任何状态都不会被保存。
TransactionTemplate
实例 的确会
维护配置状态,所以当一些类选择共享一个单独的 TransactionTemplate
实例时,
如果一个类需要使用不同配置的TransactionTemplate
(比如,不同的隔离等级),
那就需要创建和使用两个不同的TransactionTemplate
。
分享到:
相关推荐
本篇文章将聚焦于编程式事务管理,特别是如何通过`TransactionTemplate`进行事务控制。 1. **Spring编程式事务管理**: 编程式事务管理允许开发者在代码中直接控制事务的开始、提交、回滚等操作。这种方式提供了更...
在编程式事务管理中,我们通常会使用TransactionTemplate或者PlatformTransactionManager接口。TransactionTemplate是Spring提供的一个事务管理工具类,它简化了事务管理的代码,使得我们可以在不直接接触底层事务...
编程式事务管理允许开发者通过代码来精确控制事务的边界,而`TransactionTemplate`就是Spring为编程式事务管理提供的一种便捷工具。 `TransactionTemplate`类是Spring框架的`org.springframework.transaction....
3. **TransactionTemplate**: Spring提供的一个工具类,简化了编程式事务管理的代码,使得我们可以专注于业务逻辑而不是事务控制。通过设置TransactionDefinition和执行execute方法,我们可以在一个回调函数中编写...
本教程将深入探讨如何在Spring中实现自定义事务管理器、编程式事务处理以及声明式事务`@Transactional`的使用。 首先,让我们了解事务管理的基本概念。事务是一组数据库操作,这些操作要么全部执行,要么全部回滚,...
首先,编程式事务管理依赖于编程的方式显式地控制事务的开始、提交、回滚等操作。它通过实现 `PlatformTransactionManager` 接口的实例,如 `HibernateTransactionManager` 或 `DataSourceTransactionManager` 来...
本资料着重于“编程式事务管理”,这是一种通过代码直接控制事务开始、提交、回滚等操作的方式。 在Spring中,编程式事务管理通常使用PlatformTransactionManager接口实现,如DataSourceTransactionManager(适用于...
Spring 声明事务、编程事务实现 Spring 声明事务是指使用 Spring 框架来管理事务,实现事务控制。声明式事务管理是建立在 AOP 之上的,它的本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务...
Spring 提供了多种方式来实现编程式事务管理,例如使用 TransactionTemplate、TransactionInterceptor 等。 六、声明式事务管理 声明式事务管理是指通过配置文件或注解的方式来管理事务的提交和回滚。 Spring ...
声明式事务基于AOP(面向切面编程),通过在配置文件或注解中声明事务规则,而编程式事务则是通过编程的方式来控制事务的开始、提交、回滚等操作。 3. **编程式事务**:编程式事务通常通过TransactionTemplate或者...
编程式事务管理适合对事务有特殊需求或需要精细控制的场合,而声明式事务管理则更适合大部分常规情况,让代码更加整洁。在实际项目中,根据具体需求和团队习惯来选择合适的事务管理方式是非常重要的。
编码式事务,也称为编程式事务管理,是指在代码中显式地控制事务的开始、提交、回滚等操作。这种方式虽然灵活,但会增加代码的复杂性和维护难度。下面将详细阐述Spring+MyBatis中的编码式事务管理。 1. **Spring的...
**声明式事务管理**则是基于AOP(面向切面编程)的,通过在XML配置文件或者使用Java注解(@Transactional)来声明哪些方法需要在事务中运行。这种方式使得事务管理与业务逻辑解耦,提高了代码的可读性和可维护性。...
编程式事务管理是指在代码中显式地控制事务的开始、提交、回滚等操作,而声明式事务管理则是通过配置或注解来定义事务边界,更加简洁且易于维护。 标题"spring编程式事物"主要关注的是编程式事务管理。这种方式允许...
详解Spring学习之编程式事务管理 Spring框架中提供了两种事务管理方式:编程式事务管理和声明式事务...我们讨论了编程式事务管理的定义、优点和缺点,并提供了一些示例代码来演示如何使用编程式事务管理来管理事务。
事务模板(`TransactionTemplate`)是Spring提供的一种编程式事务管理工具,它简化了在非AOP环境中使用事务的代码。`TransactionTemplate`包装了`PlatformTransactionManager`,并提供了一种简单的API来执行事务内的...
编程式事务管理通常通过AOP(面向切面编程)的TransactionTemplate或PlatformTransactionManager接口直接在代码中控制事务,而声明式事务管理则是基于AOP的,通过配置XML或使用注解来定义事务边界。 1. **配置...
声明式事务管理通过配置元数据(如XML或注解)来控制事务边界,而编程式事务管理则通过TransactionTemplate或PlatformTransactionManager接口直接在代码中管理事务。 在描述中提到的博客文章中,作者可能详细讲解了...