`

本地事务系列之三:使用TransactionTemplate

阅读更多
TransactionTemplate的灵活性好,可以给代码块加事务处理,而不是方法粒度的控制。

FruitShop实现:
public class TxTemplateJdbcFruitShop extends JdbcDaoSupport implements FruitShop {
	private PlatformTransactionManager txManager;

	public void setTxManager(PlatformTransactionManager txManager) {
		this.txManager = txManager;
	}

	@Override
	public boolean purchase(final int fruitId, final String userName, final int count) {
		TransactionTemplate txTemplate = new TransactionTemplate(txManager);
		
		final String querySql = "SELECT PRICE FROM FRUIT WHERE ID = ?";
		final String upStockSql = "UPDATE FRUIT_STOCK SET STOCK = STOCK - ? WHERE ID = ?";
		final String upAccountSql = "UPDATE ACCOUNT SET BALANCE = BALANCE - ? WHERE USERNAME = ?";

		int retVal = txTemplate.execute(new TransactionCallback<Integer>() {

			@Override
			public Integer doInTransaction(TransactionStatus status) {
				int price = getJdbcTemplate().queryForInt(querySql, new Object[] { fruitId });
				getJdbcTemplate().update(upStockSql, new Object[] { count, fruitId });
				getJdbcTemplate().update(upAccountSql, new Object[] { price * count, userName });
				return 1;
			}
		});

		return retVal == 1;
	}
}


beans-fruitshop.xml文件加入:
<bean id="txTemplateFruitShop" class="com.john.tx.service.impl.TxTemplateJdbcFruitShop">
  <property name="dataSource" ref="dataSource" />
  <property name="txManager" ref="txManager" />
</bean>


JdbcFruitShopTest类加入:
@Resource(name = "txTemplateFruitShop")
FruitShop txTemplateFruitShop;

@Test
public void txTemplateTest() {
	int fruitId = 1;
	String userName = "user1";
	int count = 3;
	txTemplateFruitShop.purchase(fruitId, userName, count);
}



附:
1. 可以直接注入TransactionTemplate实例,不用在代码中实例化:
去除PlatformTransactionManager属性,直接使用TransactionTemplate属性:
private TransactionTemplate txTemplate;

public void setTxTemplate(TransactionTemplate txTemplate) {
	this.txTemplate = txTemplate;
}


beans-fruitshop.xml加入:
<bean id="txTemplate" class="org.springframework.transaction.support.TransactionTemplate">
  <property name="transactionManager" ref="txManager" />
</bean>

<bean id="txTemplateFruitShop" class="com.john.tx.service.impl.TxTemplateJdbcFruitShop">
  <property name="dataSource" ref="dataSource" />
  <property name="txTemplate" ref="txTemplate" />
</bean>


2. execute方法可以接受TransactionCallback接口的抽象类,如TransactionCallbackWithoutResult:
txTemplate.execute(new TransactionCallbackWithoutResult() {

	@Override
	protected void doInTransactionWithoutResult(TransactionStatus status) {
		...
	}
});


看下其实现:
接口方法中抽出一个没有返回结果的抽象方法(由用户自己实现),返回null是为了适配接口。
public abstract class TransactionCallbackWithoutResult implements TransactionCallback<Object> {
	public final Object doInTransaction(TransactionStatus status) {
		doInTransactionWithoutResult(status);
		return null; // 返回null
	}

	// 抽象方法,需要自定义实现
	protected abstract void doInTransactionWithoutResult(TransactionStatus status);
}
分享到:
评论

相关推荐

    spring编程式事务实现

    本篇文章将聚焦于编程式事务管理,特别是如何通过`TransactionTemplate`进行事务控制。 1. **Spring编程式事务管理**: 编程式事务管理允许开发者在代码中直接控制事务的开始、提交、回滚等操作。这种方式提供了更...

    请教:spring事务不起作用

    在`MyTransactionTemplate.java`中,这是一个自定义的事务模板类,它继承自Spring的`TransactionTemplate`。这个类用于在非代理对象中进行事务操作,通常在AOP无法自动管理事务的场景下使用。你需要检查其中的`...

    Java事务设计模式_java_事务设计模式_

    例如,使用Spring的PlatformTransactionManager接口,通过TransactionTemplate或直接在Service层使用@Transactional注解进行事务管理。 3. **声明式事务模型**:这是更推荐的方式,事务管理与业务逻辑分离,使得...

    使用Spring的事务模板

    在Spring框架中,事务管理是核心功能之一,它允许开发者以声明式或编程式的方式处理事务。本篇文章将深入探讨“使用Spring的事务模板”这一主题,帮助你理解如何在应用中有效地管理事务。 首先,Spring事务管理有两...

    全面分析 Spring 的编程式事务管理及声明式事务管理

    3. **TransactionTemplate**: Spring提供的一个工具类,简化了编程式事务管理的代码,使得我们可以专注于业务逻辑而不是事务控制。通过设置TransactionDefinition和执行execute方法,我们可以在一个回调函数中编写...

    spring事务1

    8. **编程式事务管理**:通过TransactionTemplate或PlatformTransactionManager直接管理事务,需要在代码中显式控制事务的开始、提交、回滚。 9. **问题与解决**:在同一个类中,一个方法调用另一个方法时,AOP无法...

    spring声明事务,编程事务实现

    编程式事务管理使用 TransactionTemplate 或者直接使用底层的 PlatformTransactionManager。声明式事务管理有基于 tx 和 aop 名字空间的 xml 配置文件和基于 @Transactional 注解的方式。 为什么使用 Spring 来进行...

    Spring事务管理4种方式

    在Spring框架中,事务管理是核心功能之一,它确保了数据操作的一致性和完整性。本文将详细介绍Spring事务管理的四种方式:编程式事务管理、声明式事务管理、PlatformTransactionManager接口以及TransactionTemplate...

    spring 自定义事务管理器,编程式事务,声明式事务@Transactional使用

    例如,你可以使用`TransactionTemplate`或直接调用`TransactionDefinition`和`TransactionStatus`来管理事务。以下是一个简单的编程式事务示例: ```java @Autowired private PlatformTransactionManager ...

    Spring事务例子

    这可能涉及到创建一个事务管理器实例,然后在业务方法中调用`TransactionTemplate`或者直接使用`PlatformTransactionManager`进行事务的开始、提交和回滚。 2. **声明式事务案例**:这个案例将展示如何在Service层...

    SSM事务管理所需jar包

    - 编程式事务管理:使用TransactionTemplate或者PlatformTransactionManager接口直接进行事务控制。这种方式更灵活,可以精确控制事务的边界,但代码侵入性强,不易维护。 在实际开发中,通常结合这两种方式使用,...

    spring事物 支持

    例如,通过`TransactionTemplate`或者直接使用`TransactionStatus`接口来管理事务的生命周期。虽然这种方式提供了最大的灵活性,但会增加代码的复杂性,并且不易于维护。 2. **声明式事务管理**:这是Spring最常用...

    spring事务管理

    在Spring框架中,编程式事务管理主要通过`org.springframework.transaction.support.TransactionTemplate`或`org.springframework.transaction.PlatformTransactionManager`来实现。 **示例代码分析**: 首先,...

    Spring的事务管理小案例

    例如,使用`TransactionTemplate`可以在模板类中处理事务逻辑,或者直接调用`TransactionManager`的`beginTransaction()`, `commit()`和`rollback()`方法。 2. **声明式事务管理**:这是Spring更推荐的方式,通过...

    spring_tx编程式事务代码

    使用`TransactionTemplate.execute`方法,我们可以传递一个事务回调函数。这个回调函数将在事务的边界内执行,如果发生异常,事务将被回滚;否则,事务将在回调函数执行完毕后正常提交。例如: ```java ...

    Spring4--3.jdbcTemplate事务

    - **事务模板**:TransactionTemplate是编程式事务管理的一个工具类,它提供了一种简单的方式来包装数据库操作。类似于JdbcTemplate,TransactionTemplate也处理了事务的开始、提交和回滚。 - **异常回滚规则**:...

    spring 事物底层原理分析1

    2. **编程式事务管理**:使用 TransactionTemplate 或直接操作 TransactionManager 接口进行事务控制,虽然灵活性较高,但可能导致事务控制代码与业务代码混杂。 Spring 事务管理涉及到的主要接口有: - **...

    Spring事务类型祥解

    在Spring中,可以使用`@Transactional`注解的`propagation`属性配合`TransactionTemplate`进行更安全的编程式事务管理。 2. **声明式事务管理**: 声明式事务管理是Spring的核心特性之一,它通过AOP(面向切面编程...

    Xml文件配置实现声明式事务管理

    编程式事务管理需要在代码中手动调用`TransactionTemplate`或`PlatformTransactionManager`的API来开始、提交、回滚事务,而声明式事务管理则更倾向于面向切面编程(AOP)的方式,通过配置来定义事务的边界。...

Global site tag (gtag.js) - Google Analytics