【Java架构师】一个神奇的事务控制代码

234 篇文章 6 订阅
77 篇文章 1 订阅

一 前言
事务,是一个很大的概念,程序员通过操控事务来保证数据的一致性,可是也是经常被忽略的一个点,为什么呢,因为功能的开发者,经常是单向的开发,就是不考虑异常的发生,这也是为什么很多人不喜欢写异常处理,同样事务本身是一个补偿机制,是一个出现问题后才会有用的技术。
二 故事背景
乐乐在做功能时发现了这样一段代码,而且上面有一段神奇的注释
/**

此方法不能加事务,否则会导致save的数据还会提交到数据库时finish中产生的event在消费时找不到对应的记录
@param trans
@param operator
*/
public void recharge(Transaction trans, String operator) {
trans = this.tradeService.save(trans);
this.tradeService.finish(trans, trans.getBankName(), trans.getTradeSerialNo(), operator);
}
@Transactional(rollbackFor = Throwable.class)
public Transaction finish(Transaction trans, String bankName, String string, String operator) {
trans.setBankName(bankName);
trans.setReceiveString(string);
trans.setStatus(Transaction.Status.Success.value());
trans.audit(operator);
//扣款成功时间
trans.setDeductionDoneTime(new Date());
trans = save(trans);
return this.notify(trans);
}

public Transaction notify(Transaction trade) {
logger.info(“发起调用结算通知:{},TransactionId:{} 生成事件”,trade.getPaymentRef(),trade.getNotifyId());
this.bus.asyncPost(new JmsMessages.AfterTradeCallback(trade.getNotifyId()));
return trade;
}
扩列下我尉(同英):CGMX9880 获取更多 程序员架构学习资料,
技术也是在不断更新,我相信你也想学到最新技术,
所以你们就不要说我骗人的,加的都获取资料,
学习更上一层楼了!Java,人工智能,架构师,初级程序员提升都有!
代码是从上到下的调用方式,首先上面写了一个注释不能加事务,是不是很奇怪,然后我们发现一个表被save了两次,一番思考后看出了端倪,是因为如果对第一个方法加了事务,那么整个调用链就都在一个事务里面,而抛出事件后是在另外一个线程中处理数据,这样同步的情况下,上一个事务其实没有提交,就导致后面的事件线程无法获取到上一个事务中插入数据库的数据,其实这段代码在不开启同步时是没错的,因为异步处理,上一个事务会提交,事件进行读取数据时就可以读取到了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值