事务使用

今天,遇到了这样一个问题,排查了将近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;
            }
        });

 

 

 

 

 

posted @ 2013-04-28 17:25  技术草根女  Views(299)  Comments(1Edit  收藏  举报