`

本地事务系列之二:使用PlatformTransactionManager

阅读更多
Spring的事务管理器接口:
public interface PlatformTransactionManager {

	TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException; // 获取事务状态

	void commit(TransactionStatus status) throws TransactionException; // 提交事务

	void rollback(TransactionStatus status) throws TransactionException; // 回滚事务
}


Spring提供的实现


这里是单数据源,可以使用DataSourceTransactionManager:
FruitShop实现类:
public class TransactionalApiJdbcFruitShop extends JdbcDaoSupport implements FruitShop {
	private PlatformTransactionManager txManager;

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

	@Override
	public boolean purchase(int fruitId, String userName, int count) {
		TransactionDefinition definition = new DefaultTransactionDefinition();
		TransactionStatus status = txManager.getTransaction(definition);

		String querySql = "SELECT PRICE FROM FRUIT WHERE ID = ?";
		String upStockSql = "UPDATE FRUIT_STOCK SET STOCK = STOCK - ? WHERE ID = ?";
		String upAccountSql = "UPDATE ACCOUNT SET BALANCE = BALANCE - ? WHERE USERNAME = ?";

		try {
			int price = getJdbcTemplate().queryForInt(querySql, new Object[] { fruitId });
			getJdbcTemplate().update(upStockSql, new Object[] { count, fruitId });
			getJdbcTemplate().update(upAccountSql, new Object[] { price * count, userName });
			txManager.commit(status);
		} catch (DataAccessException e) {
			txManager.rollback(status);
			throw e;
		} catch (TransactionException e) {
			txManager.rollback(status);
			throw e;
		}
		return true;
	}
}


beans-fruitshop.xml文件:
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  <property name="driverClassName" value="com.mysql.jdbc.Driver" />
  <property name="url" value="jdbc:mysql://localhost:3306/spring?characterEncoding=utf8" />
  <property name="username" value="spring" />
  <property name="password" value="123456" />
</bean>

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource" />
</bean>

<bean id="txApiFruitShop" class="com.john.tx.service.impl.TransactionalApiJdbcFruitShop">
  <property name="dataSource" ref="dataSource" /><!--JdbcDaoSupport的子类需要指定dataSource-->
  <property name="txManager" ref="txManager" />
</bean>


测试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:/beans-fruitshop.xml" })
public class JdbcFruitShopTest {
	@Resource(name = "txApiFruitShop")
	FruitShop txApiFruitShop;

	@Test
	public void txApiTest() {
		int fruitId = 1;
		String userName = "user1";
		int count = 3;
		txApiFruitShop.purchase(fruitId, userName, count);
	}
}
  • 大小: 29.5 KB
分享到:
评论

相关推荐

    JAVA(Spring)事务管理.doc

    Spring事务管理高层抽象主要包括3个接口...1.PlatformTransactionManager//事务管理器 真正用来管理事务的接口,包含事务提交和回滚等信息; Spring为不同的持久层框架提供不同的PlatformTransactionManager接口实现;

    基于java的企业级应用开发:Spring事务管理概述.ppt

    如下图所示: Spring事务管理的三个核心接口 5.1.1 事务管理的核心接口 1.Platform TransactionManager PlatformTransactionManager接口是Spring提供的平台事务管理器,主要用于管理事务。该接口中提供了三个事务

    分布式事务1

    事务功能的总体接口设计先来看下三大接口PlatformTransactionManager : 事务管理器TransactionDefinition : 事务的

    Spring笔记说明文件

    1)、事务增强器要用事务注解的信息,AnnotationTransactionAttributeSource解析事务注解 2)、事务拦截器: TransactionInterceptor;保存了事务属性信息,事务管理器; 他是一个 MethodInterceptor; 在目标...

    Spring.html

    PlatFormTransactionManager:平台事务管理器:定义了commit/rollback Mybatis/jdbc:DataSourceTransactionManager Hibernater:HibernaterTransactionManager TransactionManagerDifinition 传播行为:A--&gt;B,...

    Spring事务管理4种方式

    Spring事务管理4种方式 入门级 最简单demo PlatformTransactionManager TransactionTemplate

    Spring 2.0 开发参考手册

    9.6.2. 使用 PlatformTransactionManager 9.7. 选择编程式事务管理还是声明式事务管理 9.8. 与特定应用服务器集成 9.8.1. BEA WebLogic 9.8.2. IBM WebSphere 9.9. 公共问题的解决方案 9.9.1. 对一个特定的 ...

    Spring中文帮助文档

    9.6.2. 使用PlatformTransactionManager 9.7. 选择编程式事务管理还是声明式事务管理 9.8. 与特定应用服务器集成 9.8.1. IBM WebSphere 9.8.2. BEA WebLogic 9.8.3. Oracle OC4J 9.9. 常见问题的解决方法 ...

    Spring API

    9.6.2. 使用PlatformTransactionManager 9.7. 选择编程式事务管理还是声明式事务管理 9.8. 与特定应用服务器集成 9.8.1. IBM WebSphere 9.8.2. BEA WebLogic 9.8.3. Oracle OC4J 9.9. 常见问题的解决方法 ...

    spring chm文档

    9.6.2. 使用 PlatformTransactionManager 9.7. 选择编程式事务管理还是声明式事务管理 9.8. 与特定应用服务器集成 9.8.1. BEA WebLogic 9.8.2. IBM WebSphere 9.9. 公共问题的解决方案 9.9.1. 对一个特定的 ...

    Spring-Reference_zh_CN(Spring中文参考手册)

    9.6.2. 使用 PlatformTransactionManager 9.7. 选择编程式事务管理还是声明式事务管理 9.8. 与特定应用服务器集成 9.8.1. BEA WebLogic 9.8.2. IBM WebSphere 9.9. 公共问题的解决方案 9.9.1. 对一个特定的 ...

    spring_day04

    PlatformTransactionManager接口(平台事务管理器接口),不管使用哪种方式管理事务,这个类必须配置的!!

    spring中事物管理1

    3.1平台事务管理器PlatformTransactionManager主要定义了各个不同的数据库平台的一些接口,针对不同的数据库平台进行事务管理org.spr

    dbqueue:Java中基于数据库的队列抽象

    这是一种基于数据库表和本地线程池的队列机制。 用法 DbQueue 与 Spring 紧密耦合,特别是它可以利用 Spring 的PlatformTransactionManager抽象。 使用 DbQueue 如下: 根据给定的liquibase.xml文件创建Queue...

    spring 自动装配和aop的使用

    主要介绍了spring 自动装配和aop的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    SPRING API 2.0.CHM

    PlatformTransactionManager PluggableSchemaResolver Pointcut PointcutAdvisor PointcutComponentDefinition PointcutEntry Pointcuts PoolingConfig PortletApplicationContextUtils ...

    spring-framework-reference4.1.4

    Not Using Commons Logging ................................................................... 12 Using SLF4J ..............................................................................................

    spring-framework-reference-4.1.2

    Not Using Commons Logging ................................................................... 12 Using SLF4J ..............................................................................................

Global site tag (gtag.js) - Google Analytics