【发布时间】:2016-02-11 14:07:02
【问题描述】:
我的问题涉及混合编程和声明式事务可能出现的并发问题。我正在开发一个以编程方式处理数据库连接和事务的遗留软件(Spring + Hibernate)。
Session db = HibernateUtil.getSessionFactory().openSession();
db.beginTransaction();
// do stuff
db.getTransaction().commit();
该软件具有使用带有声明性事务 (@Transactional) 的 Spring 数据架构的更新模块。当从“手动”打开的事务内部调用较新的 Spring 服务时,我们在极少数情况下使用 Microsoft SQL Server 遇到数据库死锁。我认为问题在于有两个嵌套事务读取/写入相同的表导致死锁。
Session db = HibernateUtil.getSessionFactory().openSession();
db.beginTransaction();
// do stuff
springService.getStuff();
// do stuff
db.getTransaction().commit();
有没有办法安全地混合这些事务或在两者中使用已经开始的事务?我应该在调用 Spring @Service/@Repository 方法之前关闭手动/以编程方式打开的事务吗? Spring 和 HibernateUtil 都使用相同的实体管理器进行数据库连接。
【问题讨论】: