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



[size=medium]附:[/size]
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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值