`

本地事务系列之二:使用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
分享到:
评论

相关推荐

    JavaAnd数据库事务[整理].pdf

    2. 本地事务的实现:通过JDBC的Connection对象的commit()和rollback()方法来控制事务的开始、结束和回滚。然而,这种实现方式可能导致事务管理代码分散,不易维护。 3. 全局事务:JTA(Java Transaction API)提供了...

    多数据源分布式事务管理调研报告.zip

    - Apache ShardingSphere:提供分布式事务解决方案,包括2PC、TCC、Saga和本地事务的代理模式。 3. **挑战与优化**: - 性能:分布式事务通常会引入额外的网络通信和协调开销,需要通过优化算法、减少事务粒度等...

    spring 结合druid和hibernate使用jta配置分布式事务

    在事务管理方面,Spring支持编程式和声明式事务,可以处理单个数据库的本地事务,以及跨多个数据源的分布式事务。 `Druid` 是阿里巴巴开源的一个高性能、可扩展的数据源连接池。它除了提供基础的连接池功能外,还...

    事物管理javaweb.zip

    8. **补偿事务(Saga)**:在微服务架构中,由于单个事务可能涉及多个服务,因此出现了Saga模式,它通过一系列小的本地事务来实现长事务,每个小事务称为一个补偿操作,如果前面的操作失败,后续的补偿操作将回滚...

    javaSpring-经典概念题-试题-中文

    - **事务管理**:提供了一套统一的事务管理API,支持本地和分布式事务。 - **模型-视图-控制器(Model-View-Controller, MVC)**:支持构建Web应用程序,分离业务逻辑与表示层。 #### 二、Spring IoC容器 **Spring...

    google-api-services-coordinate-v1-rev43-1.16.0-rc.zip

    JTXer可能包含了一系列示例代码,帮助开发者理解如何在Java应用中实现和管理事务,包括本地事务和分布式事务。这些示例可能会涵盖Spring框架中的PlatformTransactionManager接口、JTA(Java Transaction API)以及...

    第五章:Spring AOP 在 Spring Framework 内部应用1

    Spring还提供了一系列接口和类,如PlatformTransactionManager负责实际的事务管理,TransactionalEventListener用于监听事务相关的事件,以及TransactionDefinition和TransactionStatus接口,它们分别代表事务的定义...

    Spring整合Hibernate示例完整代码

    在整合Hibernate时,我们可以配置PlatformTransactionManager(如HibernateTransactionManager),并通过@Transactional注解在服务层方法上启用事务管理。 4. **DAO(数据访问对象)层**:Spring整合Hibernate后,...

    spring源码包-源码包源码包

    编程式事务管理使用 `PlatformTransactionManager` 接口,而声明式事务管理则基于 AOP,通过 `@Transactional` 注解实现。源码中,`TransactionDefinition` 和 `TransactionStatus` 描述了事务的属性和状态。 4. **...

    java面试问题汇总(非常全面)

    使用 `@Transactional` 注解来声明式地管理事务,或者通过 `PlatformTransactionManager` 接口编程式地管理事务。 #### 53. 对Spring的AOP的理解 Spring AOP(Aspect Oriented Programming)提供了一种机制,用于...

    spring 中常用的设计模式.docx

    PlatformTransactionManager 接口定义了一系列事务管理的基本操作,如 getTransaction、commit 和 rollback,而具体的事务管理策略则由不同的实现类来提供。这种设计允许用户根据应用的实际需求选择不同的事务管理...

Global site tag (gtag.js) - Google Analytics