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

Spring的事务管理器接口:

public interface PlatformTransactionManager {

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

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

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


Spring提供的实现
[img]http://dl2.iteye.com/upload/attachment/0099/2478/b137cf23-1e25-312f-a568-81ae400f8ebd.png[/img]

这里是单数据源,可以使用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);
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值