my last questionJPA executeUpdateは行を無期限にロックできますか?
コンカレントプロシージャのデータの問題を避けるために、アプリケーションにPESSIMISTIC_WRITEロックを実装しました。
この問題とINNODB_LOCK_WAIT_TIMEOUT変数が120に設定されていても、まだデッドロックが発生しています。
私はソースをチェックしています(私はこのプロジェクトで新しくなりました)、私がJPAを使用して行を更新する方法は以前とは異なっています。
私たちは、どのような私の注意を取得すると、コミットマージ、フラッシュまたは私はマージ法のようなトランザクションを閉じていますが保証は何もありませんされてTypedQuery<Account> q = em.createQuery("UPDATE Account a SET a.balance=a.balance+:quantity",Account.class);
q.setParameter("quantity",100);
q.executeUpdate();
return;
すなわち行を更新するために型指定されたクエリを使用
EntityManagerから取得します。
を使ってトランザクションを使用しているのですか? –
悲しいことに、行を更新するメソッドでトランザクション注釈が表示されません。繰り返しますが、これは私のコードではありません。私はEntityManagerメソッド(persist、merge、refreshなど)を使用しています。 – Rafihna
executeUpdate呼び出しはトランザクション外で実行されると例外を発生させます。したがって、トランザクションはトランザクション内で行われている必要があります。ペシミスティック・ロックは通常読み取り時に行われるため、ロックを続行する前に先行を知り、他のロックが完了するまで待つことができます。デッドロックが発生している場合は、ロックした行と他のプロセスがロックしている行を確認し、それらのロックを取得した順序を並べ替える必要があります。この1つの方法より多くの情報が必要です。 – Chris