JPA查询javadoc (参见http://docs.oracle.com/javaee/6/api/javax/persistence/Query.html#executeUpdate()说
int executeUpdate() Execute an update or delete statement.
Returns: the number of entities updated or deleted
Throws:
IllegalStateException - if called for a Java Persistence query language SELECT statement or for a criteria query
TransactionRequiredException - if there is no transaction
QueryTimeoutException - if the statement execution exceeds
the query timeout value set and only the statement is rolled back
PersistenceException - if the query execution exceeds
the query timeout value set and the transaction is rolled back回滚一个陈述和一个交易有什么区别?我的意思是,回滚事务是非常明显的,它将事务设置为回滚,所有操作都将被撤消。但是,如果该语句被回滚(因为它是一个update/delete/insert操作),那么在这种情况下不也会回滚整个事务吗?
此QueryTimeoutException是否设计为被捕获并允许用户在超时时重试而不影响事务?
发布于 2016-05-28 22:04:23
当查询超时且只回滚该语句时,持久性提供程序将引发QueryTimeoutException。当前事务(如果是活动的)将不会被标记为回滚。[QueryTimeoutException]
QueryTimeoutException是PersistenceException的一个专门化。
当出现问题时,持久性提供程序将引发PersistenceException。PersistenceException 的所有实例( NoResultException、NonUniqueResultException、LockTimeoutException和QueryTimeoutException实例除外)都将导致当前事务被标记为回滚(如果一个事务是活动的,并且持久化上下文已被连接到它)。[PersistenceException]
因此,如果查询超时并不重要,那么在默认情况下,它不会导致事务回滚。这就是为什么你必须总是明确地这样做的原因。例如,如果您想回滚事务,而不管发生哪个PersistenceException。
catch(PersistenceException e) { ... tx.rollback(); ... }但是,有时继续一个事务是有意义的,即使一条语句不成功,并且发生了一个QueryTimeoutException。
一个示例场景是语句执行期间的超时,该语句只保留一个额外的日志记录。取决于您的用例,执行日志语句的超时时间可能不是关键的,否则,如果核心业务流程(例如,保持订单超时)是至关重要的。因此,您不希望失败的log语句会影响订单的持久化。另一方面,如果订单的持久化失败,则应该回滚日志记录的持久化。因此,您可以始终决定哪个查询超时应该导致回滚。
一个示意性的例子应该是
...
try {
...
queryNonCritical.execute(...);
}
catch(QueryTimeoutException e) {
// not critical move on
...
}
...
try {
...
queryCritical.execute(...);
}
catch(QueryTimeoutException e) {
...
tx.rollback();
...
}
...https://stackoverflow.com/questions/37503601
复制相似问题