GWT ORM OrmConcurrencyException:检测到并发修改 - 查找原因

GWT ORM OrmConcurrencyException: Concurrent modification detected - find the cause

在基于 GWT 的应用程序(特别是 Google Gerrit)中,我遇到异常(在执行 gerrit review 命令时):

com.google.gwtorm.server.OrmConcurrencyException: Concurrent modification detected
       at com.google.gwtorm.jdbc.JdbcAccess.execute(JdbcAccess.java:449)
       at com.google.gwtorm.jdbc.JdbcAccess.updateAsBatch(JdbcAccess.java:270)
       at com.google.gwtorm.jdbc.JdbcAccess.update(JdbcAccess.java:223)

有没有办法确定具体是哪些数据导致了并发错误?

查看 GWT ORM 的源代码,我假设 UPDATE 准备好的语句与要更新的数据不匹配,因此没有更新任何内容。最后抛出OrmConcurrencyException通知调用者

并行执行 gerrit review 时可能会发生这种情况。

例如,如 https://code.google.com/p/gerrit/issues/detail?id=3730&thanks=3730&ts=1450711628 所报告,更新两个不同标签的 --label 会导致此错误:

bash-3.2$ ssh robot@gerrit.foo.int gerrit review --label Verified=-1 \
    --message '"Verified .. -1."' 2463,9 & \
    ssh robot@gerrit.foo.int gerrit review --label Tested=+1 \
    --message '"Tested .. +1."' 2463,9 &
[3] 29329
[4] 29330
bash-3.2$
bash-3.2$ error: Cannot post review
one or more reviews failed; review output above

[3]   Done                    ssh robot@gerrit.foo.int gerrit review --label Verified=-1 --message '"Verified .. -1."' 2463,9
[4]   Exit 1                  ssh robot@gerrit.foo.int gerrit review --label Tested=+1 --message '"Tested .. +1."' 2463,9

再次重新触发其中一个命令应该就可以了(或修复报告的问题)。