今天爱分享给大家带来手工开启事务注意保证commit或rollback及避免长事务【附代码】,希望能够帮助到大家。
用事务时,确保commit或rollback执行。避免由于代码问题,commit或rollback未执行,连接未正常归还连接池,导致服务整体挂掉。(生产我知道的有两次)。错误代码示例:
ITransactionManager txManager = getTransactionManager(); txManager.begin(); try{ insert(String orderNo, Limit limit); // 问题一:有可能外部服务不稳定,导致长事务 callRemoteService(orderNo); int res = updateOrder(orderNo); // 问题二:有可能事务未提交 if(res > 0) txManager.commit(); }catch(Exception e){ txManager.rollback(); logger.error(e.getMessage(), e); }
正确代码:
callRemoteService(orderNo); ITransactionManager txManager = getTransactionManager(); txManager.begin(); try{ insert(String orderNo, Limit limit); updateOrder(orderNo); txManager.commit(); }catch(Exception e){ txManager.rollback(); logger.error(e.getMessage(), e); }