数据库事务管理:掺杂使用entityDao和jdbcTemplate时的问题
问题
代码中有一个较大的事务,需要做多次数据库的增删改等操作。
其中一个新增操作我使用了公司封装的hibernate的entityDao;其它操作使用的是spring提供的jdbcTemplate。二者操作流程基本如下:
entityDao.save(写入表1)
jdbcTemplate.update(根据entityDao向表1写入的最新数据,更新表2)
结果,entityDao能够正确写入表1;但是jdbcTemplate的更新操作却始终失败(数据库操作正常结束,但应该被更新的数据没有被更新)。
分析
烦了很久,最后把所有的sql和transaction管理日志全部打印出来,发现一个小问题。
entityDao 的相关事务,是hibernate自己管理的;但jdbcTemplate的事务,是根据代码中配置的@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class),由JTATransactionInterceptor
管理的。
这就是问题原因所在。二者的事务管理机制不一样,因此相当于在两个不同的事务中执行各自的数据库操作。jdbcTemplate在自己的事务中,是看不到entityDao写入它的事务、但暂时没有提交到数据库的数据库的。
解决
总之:如果要进行数据库的增删改操作,要么统一使用entityDao,要么统一使用jdbcTemplate。不要混用。