Spring的事務管理器接口:
Spring提供的實現
這里是單數據源,可以使用DataSourceTransactionManager:
FruitShop實現類:
beans-fruitshop.xml文件:
測試:
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);
}
}
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

