spring事务管理PlatformTransactionManager及transactionTemplate
Posted 好大的月亮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring事务管理PlatformTransactionManager及transactionTemplate相关的知识,希望对你有一定的参考价值。
事务三大接口
org.springframework.transaction.PlatformTransactionManager 事务管理器
org.springframework.transaction.TransactionDefinition 事务的一些基础信息,如超时时间、隔离级别、传播属性等
org.springframework.transaction.TransactionStatus 事务的一些状态信息,如是否一个新的事务、是否已被标记为回滚
PlatformTransactionManager
public interface PlatformTransactionManager
//根据事务定义TransactionDefinition,获取事务
TransactionStatus getTransaction(TransactionDefinition definition);
//提交事务
void commit(TransactionStatus status);
//回滚事务
void rollback(TransactionStatus status);
事务定义接口TransactionDefinition
// 事务的定义包括: 事务的隔离级别,事务的传播属性,超时时间设置
// ,是否只读事务的隔离级别是数据库本身的事务功能,事务的播属性则是spring为我们提供的功能
该接口的实现DefaultTransactionDefinition,默认的事务定义
public class DefaultTransactionDefinition implements TransactionDefinition, Serializable
//事务的传播属性默认为PROPAGATION_REQUIRED,即当前没有事务的时候,创建一个,如果有则使用当前事务
private int propagationBehavior = PROPAGATION_REQUIRED;
//事务的隔离级别采用底层数据库默认的隔离级别
private int isolationLevel = ISOLATION_DEFAULT;
//超时时间采用底层数据库默认的超时时间
private int timeout = TIMEOUT_DEFAULT;
//是否只读为false
private boolean readOnly = false;
...
事务接口定义 TransactionStatus
TransactionStatus它继承了SavepointManager接口,SavepointManager是对事务中上述保存点功能的封装
public interface SavepointManager
Object createSavepoint() throws TransactionException;
void rollbackToSavepoint(Object savepoint) throws TransactionException;
void releaseSavepoint(Object savepoint) throws TransactionException;
TransactionStatus本身更多存储的是事务的一些状态信息 是否是一个新的事物 是否有保存点 是否已被标记为回滚
PlatformTransactionManager+transactionStatus使用demo
执行demo
@Autowired
private PlatformTransactionManager transactionManager;
TransactionStatus status = null;
// 手动开启事务
status = transactionManager.getTransaction(new DefaultTransactionDefinition());
// 事务提交
transactionManager.commit(status);
// 事务回滚
if (StringMoreUtils.checkValNotNull(status))
transactionManager.rollback(status);
demo2
@Autowired
private PlatformTransactionManager platformTransactionManager;
@Autowired
private TransactionDefinition transactionDefinition;
//开始事务
TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition);
try
orderInfoList.forEach(el ->
orderInfoDao.updateShopSimpleName(el.getShopSimpleName(), el.getId().toString());
);
//commit
platformTransactionManager.commit(transactionStatus);
catch (TransactionException e)
e.printStackTrace();
//rollback
platformTransactionManager.rollback(transactionStatus);
transactionTemplate使用demo
private PayOrderDAO payOrderDAO;
protected TransactionTemplate transactionTemplate;
/**
- 保存支付订单
*/
protected PayOrder savePayReq(final PayOrder payOrder)
@Autowired
private TransactionTemplate transactionTemplate;
@Autowired
private PayOrderDAO payOrderDAO;
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;
以上是关于spring事务管理PlatformTransactionManager及transactionTemplate的主要内容,如果未能解决你的问题,请参考以下文章
Spring事务看这一篇就够了!!(Spring事务特征+Spring事务管理+实现+Spring七种事务传播行为+集成MyBatis)
Spring事务看这一篇就够了!!(Spring事务特征+Spring事务管理+实现+Spring七种事务传播行为+集成MyBatis)