作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 JPA Toplink-essential 并开发 RESTful Web 应用程序。
首先要提到一件事。
不使用 JTA
所以我的 persistences.xml 被定义为不使用 JTA。
<persistence-unit name="kojoPU">
<provider>oracle.toplink.essentials.PersistenceProvider</provider>
<non-jta-data-source>machinePrototype</non-jta-data-source>
这允许实体管理器不立即使用executeUpdate()执行查询它将等待直到提交。
em.getTransaciton().begin();
Query query = em.createNativeQuery("DELETE FROM table1 WHERE theId = 10;");
query.executeUpdate(); //not yet executed until transaction is commited.
//continue do something...
em.getTransaction().commit(); //the query above is executed here finally
但是有一个大问题,在transaction.begin()之后,是否有类似JSONException
或indexOutOfBoundsException
的错误,事务没有关闭并且保持开放一段时间。
在这种情况下是否可以以某种方式强制关闭交易?
最佳答案
除非我错过了什么,否则你可能想要这样的东西:
em.getTransaciton().begin();
try {
Query query = em.createNativeQuery("DELETE FROM table1 WHERE theId = 10;");
query.executeUpdate(); //not yet executed until transaction is commited.
//continue do something...
em.getTransaction().commit(); //the query above is executed here finally
} catch (ex RuntimeException) {
em.getTransaction().rollback();
} finally {
// you probably also want something here to check the status of the transaction and rollback if you exited the try block somehow
}
但是,我相信事务管理器在提交失败时回滚是惯例,但似乎这不会发生在您身上。
此外,依赖更新查询在提交时运行也不是一个好主意,因为 Hibernate 可以决定随时运行更新(本质上是执行flush())。如果您想在最后运行查询,请在提交之前执行。
关于java - JPA 与非 JTA : Is it possible to close EntityTransaction safely without commit?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4991158/
我是一名优秀的程序员,十分优秀!