2

次のようなコードを取得しました。

def myObject = MyDomainClass.get(myId)
myObject.refresh()
myObject.myProperty = myValue
myObject.save(flush:true, failOnError:true)

取得と更新にもかかわらず、保存の実行時に「org.hibernate.StaleObjectStateException: 別のトランザクションによって行が更新または削除されました (または未保存値のマッピングが正しくありませんでした)」というメッセージが表示されることがあります。

このメソッドを複数のセッションで同時に実行し始めると発生します。しかし、その後、トランザクション 1 は確実に終了し、このコードはトランザクション 2 に対して再度実行されますが、それでも失敗します! (トランザクション サービスを使用して、楽観的ロックが原因でトランザクションが失敗したときにトランザクションを再実行しています。こちらを参照してください)。

DB から「新しい」バージョンを取得しても、どうすればよいのでしょうか?

4

3 に答える 3

1

私は少なくとも回避策を見つけました-空のトランザクションをロールバックします:

myDomain.withTransaction { status -> 
  status.setRollbackOnly()
}
于 2010-12-08T10:56:28.170 に答える
1

このフォーラム スレッドは、別の Hibernate セッションが必要になる可能性があることを示唆しています。次のように、新しいトランザクションに対して新しいセッションを試行するとどうなりますか

Book.withNewSession{}
于 2010-12-08T10:07:51.110 に答える
0

あなたが使用する必要があります

MyDomainClass.lock(myId)

それ以外の

MyDomainClass.get(myId)
于 2015-05-06T11:45:22.540 に答える