本土事务系列之三:使用TransactionTemplate
本地事务系列之三:使用TransactionTemplate
TransactionTemplate的灵活性好,可以给代码块加事务处理,而不是方法粒度的控制。
FruitShop实现:
beans-fruitshop.xml文件加入:
JdbcFruitShopTest类加入:
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); }