我在Spring + Hibernate + SQLite堆棧中遇到了回滾失敗事務的問題。Spring + Hibernate + SQLite事務怪異
這裏是我的榜樣
- 註釋應用的主要類別配置http://pastebin.com/XbejGHft
- testBean就http://pastebin.com/3BSFy34p
- 訂購實體 - POJO有兩個字段(id和name)
查看方法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");
}
它創建並保留了一些Order實體。 它在一些創建之間從數據庫讀取一些數據。 最後,它拋出RuntimeException來模擬方法調用期間的失敗並強制Spring回滾事務。
執行完後,我打開數據庫,看到它只是最後一個創建的實體(createOrder(「4」))和所有其他的(名稱爲「1」,「2」和「3」)數據庫。但是由於TestBean被標記爲@Transactional,它應該刪除在一個事務性方法testMethod()中創建的所有四個實體。
我嘗試了SQLIte中的所有journal_mode,但回滾仍然不起作用。
任何想法?
看來,每個** em.persist()**調用Hibernate調用** JdbcIsolationDelegate#delegateWork **。與此同時,方法** JdbcIsolationDelegate#delegateWork **調用** Connection#commit **,它在JPA/Hibernate框架中斷開所有事務交互 – Joltd