数据库事务管理:掺杂使用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。不要混用。


本文出自 “编程的摩羯男” 博客,请务必保留此出处http://winters1224.blog.51cto.com/3021203/1570400

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。