DB 内のすべてのユーザーで実行され、「スコア」フィールドと「ヒット」フィールドを更新する長いプロセスがあります。これが実行されている間、ユーザーが自分の名前/電話などを更新しようとすると、ユーザーの更新が発生することがあります。次のエラーで失敗します:
org.springframework.dao.CannotAcquireLockException
could not execute statement; SQL [n/a]; nested exception is org.hibernate.exception.LockAcquisitionException: could not execute statement
問題は、ユーザーが自分のスコア/ヒット フィールドを更新できないことを知っているので、行がロックされないようにして、両方の更新を実行できるようにすることはできますか? (クエリは変更されたフィールドのみを更新するため、ロックを防ぐと思ったので、休止状態の@DynamicUpdateを使用していますが、運はありません)
ところで、私はSpring Boot 1.3.3.RELEASEをJava 8で使用しています(Tomcat.
* アップデート *
@Thierry の質問に答えるために、すべてのユーザー スコア/ヒットの更新に対して 1 つの大きなトランザクションを使用しています。すべてのユーザーを一度に更新する必要があります。また、このプロセスの実行中にユーザーがレコードを更新するのを防ぐことはできません。これは、システムの使用に悪影響を与えるためです。
*更新2 *
それで、たくさんの検索の後、私はまさに私が欲しいものを見つけたと思います. この記事によると: http://www.intertech.com/Blog/hibernate-optimistic-lock-without-a-version-or-timestamp/、ロック タイプがダーティで動的な更新で楽観的ロックを設定すると、次のようになります。別の方法では、他の並行プロセスが同じ列を変更しない限り、同じ行を更新できます。」問題は、エンティティを次のように設定したことです。
@DynamicUpdate
@OptimisticLocking(type = OptimisticLockType.DIRTY)
@Entity
public class User { ..
そして、私はまだロック例外を受け取ります。私はまだ何か間違ったことをしていますか?