Chr*_*ams 13 java concurrency spring hibernate jpa
我有一个并发问题,我尝试用while循环解决,尝试多次保存实体,直到达到某个最大重试次数.我想避免谈论是否有其他方法来解决这个问题.我有其他Stackoverflow帖子.:)长话短说:对派生的列有一个唯一约束,包括一个数字部分,它保持递增以避免冲突.在一个循环中,我:
所有这一切似乎都有效,除非循环回到步骤1并尝试选择,我得到:
17:20:46,111 INFO [org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl] (http-localhost/127.0.0.1:8080-3) HHH000010: On release of batch it still contained JDBC statements
17:20:46,111 INFO [my.Class] (http-localhost/127.0.0.1:8080-3) MESSAGE="Failed to save to database. Will retry (retry count now at: 9) Exception: could not execute statement; SQL [n/a]; constraint [SCHEMA_NAME.UNIQUE_CONSTRAINT_NAME]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement"
Run Code Online (Sandbox Code Playgroud)
并且发现了一个新的异常.看起来第一次刷新导致唯一约束违规并抛出DataAccessException不清除实体管理器的批处理.处理这个问题的适当方法是什么?我正在使用Spring和JPA,并且没有直接访问实体管理器.我想如果我需要的话我可以注射它但这对这个问题来说是一个痛苦的解决方案.
par*_*oid 11
你不能这样做 - 一旦你刷新一些东西并且它失败并抛出异常,事务将被标记为回滚.这意味着你捕获异常并继续进行无关紧要,你最终会回滚.实际上,抛出什么异常并不重要 - 默认情况下,Spring的事务管理器将在每个未经检查的异常上回滚.您可以通过noRollbackFor在@Transactional注释上专门定义一个来解决它(假设您正在使用注释驱动程序事务)
编辑 - 如果违反此约束,它也不会帮助您,因为事务可能会在数据库级别标记为回滚.
我发现这个问题出现同样的错误。就我而言,问题是由触发器和行锁的奇怪组合引起的(请参阅PSQLException 和在表上添加触发器时的锁定问题)。然而,花了一些时间才发现这个错误只是主要错误的结果,而不是原因。当 Hibernate 刷新会话并且发生某些约束冲突时,它会收到一些 JDBC 异常,并在 finally 块中尝试调用abortBatch. 当任何语句保留在会话中时,Hibernate 会发出此警告,尽管实际的错误应该在之前的某个地方进行搜索。
| 归档时间: |
|
| 查看次数: |
28407 次 |
| 最近记录: |