【发布时间】:2016-08-27 15:18:57
【问题描述】:
我在 Spring + Hibernate + SQLite 堆栈中回滚失败的事务时遇到问题。
这是我的示例的主要类
- 注解应用配置 http://pastebin.com/XbejGHft
- TestBean http://pastebin.com/3BSFy34p
- Order 实体 - 具有两个字段(id 和 name)的 POJO
看方法TestBean.testMethod()
public void testMethod() {
entityManager.persist(createOrder("1"));
entityManager.persist(createOrder("2"));
entityManager.persist(createOrder("3"));
entityManager.createQuery("from Order").getResultList();
entityManager.persist(createOrder("4"));
throw new RuntimeException("Managed");
}
它创建并保留一些订单实体。 在一些创作之间,它从数据库中读取一些数据。 最后抛出 RuntimeException 模拟方法调用失败,强制 Spring 回滚事务。
执行后,我打开数据库并查看,它完全回滚了仅最后创建的实体(createOrder("4"))和所有其他(名称为“1”、“2”和“3”)仍然存在于数据库。但是由于 TestBean 被标记为 @Transactional,所以它应该删除在一个事务方法 testMethod() 中创建的所有四个实体。
我尝试了 SQLIte 中的所有 journal_mode,但回滚仍然无效。
有什么想法吗?
【问题讨论】:
-
Hibernate 似乎在每个 em.persist() 调用上调用 JdbcIsolationDelegate#delegateWork。同时,方法 JdbcIsolationDelegate#delegateWork 调用 Connection#commit 破坏了 JPA/Hibernate 框架中的所有事务交互
标签: spring hibernate sqlite jpa transactions