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

本地事务系列之三:使用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);
}