spring 3.x 实现事务的几种方式(一)

2014-11-24 10:51:11 · 作者: · 浏览: 2
一、使用 编程方式
数据源、事务的底层配置
[html]
< xml version="1.0" encoding="UTF-8" >
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
class="org.springframework.transaction.support.TransactionTemplate">
www.2cto.com
DAO层的配置
[ html]
SERVICE层的配置
[html]
class="cn.com.nantian.epayment.pay.service.ElecChnlFrontPayServiceImpl">
程序示例代码
[java]
private PayOrderDAO payOrderDAO;
protected TransactionTemplate transactionTemplate;
/**
* 保存支付订单
*/
protected PayOrder savePayReq(final PayOrder payOrder) {
PayOrder order = (PayOrder) this.transactionTemplate.execute(new TransactionCallback() {
@Override
public Object doInTransaction(TransactionStatus status) {
// 查看是否已经存在支付订单,如果已经存在则返回订单主键
PayOrder payOrderTemp = payOrderDAO.findOrder(String.valueOf(payOrder.getPayOrderId()));
// 由支付渠道类型(PayChannelType)转换得到交易类型(PayType)
if (payOrder.getPayChannelId().equalsIgnoreCase(PAY_CHNL_ACT_BAL)) {// 账户余额支付
payOrder.setPayType("3");
} else if (payOrder.getPayChannelId().equalsIgnoreCase(PAY_CHNL_FAST_PAY)) {// 联通快捷支付
payOrder.setPayType("4");
} else {// 网银网关支付
payOrder.setPayType("2");
}
// 比对新的支付金额与原订单金额是否一致,如不一致则提示错误
if (payOrderTemp == null) {
String orderId = payOrderDAO.save(payOrder);
payOrder.setPayOrderId(orderId);
return payOrder;
} else {
return payOrderTemp;
}
}
});
if ("2".equals(order.getOrderState())) {// 2:表示支付成功
throw new EpaymentBizException(StatusCode.DQSystem.PAY_FAIL, "同一订单不能重复支付");
} else if (payOrder.getPayAmt().longValue() != order.getPayAmt().longValue()) {
throw new EpaymentBizException(StatusCode.DQSystem.PAY_FAIL, "交易金额与原订单不一致");
} else {
return payOrder;
}
}
public PayOrderDAO getPayOrderDAO() {
return payOrderDAO;
}
public void setPayOrderDAO(PayOrderDAO payOrderDAO) {
this.payOrderDAO = payOrderDAO;
}
public TransactionTemplate getTransactionTemplate() {
return transactionTemplate;
}
public void setTransactionTemplate(TransactionT