事务使用
今天,遇到了这样一个问题,排查了将近2h,现在想想真心笨呆了。是这样:
【问题描述】我通过界面/plsql直接查询DB数据(method1查询),确实是hutubaby, VALID。然后在另一处地方查询(method2查询),查出来的值,却总是hutubaby, INVALID。这下节操碎了。
一开始怀疑,是不是DB连的不对?毕竟是读写库分离,难道同步出了问题?于是,就开始往这方面想,探索,debug。后来确认,我只连了写库,不存在同步问题,这条路被封死。
然后,又猜想是不是查库语句写的不对,毕竟method1/method2走的是不同的sqlcode。于是,把method2转换成mothod1执行,节操又碎了,还是hutubaby, INVALID。
这下完了,完了,还可能会是什么问题?往大处着眼,method2发生在一个事务当中,那这个事务里,method2执行前会不会对数据进行了修改呢?
BINGO!确实,事务中执行了置INVALID的动作,但因为事务未提交,所以DB里看到的还是VALID!
妹啊,2h,我会永永远远冥记这个错误!
transactionTemplate.execute(new TransactionCallback<Object>() { public Object doInTransaction(TransactionStatus status) { try { //1. VALID->INVALID // 2. method2查询 } catch (Exception e) { String msg = "事务中,插入一组数据失败," + e.getMessage(); LOGGER.error(msg, e); throw new TopicOperateException(msg, e); } return null; } });