2016-07-08 6 views
0

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から取得します。

+0

を使ってトランザクションを使用しているのですか? –

+0

悲しいことに、行を更新するメソッドでトランザクション注釈が表示されません。繰り返しますが、これは私のコードではありません。私はEntityManagerメソッド(persist、merge、refreshなど)を使用しています。 – Rafihna

+0

executeUpdate呼び出しはトランザクション外で実行されると例外を発生させます。したがって、トランザクションはトランザクション内で行われている必要があります。ペシミスティック・ロックは通常読み取り時に行われるため、ロックを続行する前に先行を知り、他のロックが完了するまで待つことができます。デッドロックが発生している場合は、ロックした行と他のプロセスがロックしている行を確認し、それらのロックを取得した順序を並べ替える必要があります。この1つの方法より多くの情報が必要です。 – Chris

答えて

0

は自動生成私はEclipseのプロジェクトで使用DAOコードは、してみてくださいな(そしておそらくあなたの他のコードを見て)ヒントとして、これを使用して

* <pre> 
* EntityManagerHelper.beginTransaction(); 
* NodesDAO.save(entity); 
* EntityManagerHelper.commit(); 
* </pre> 

としてjavadocを示し

TypedQuery<Account> q = em.createQuery("UPDATE Account a SET a.balance=a.balance+:quantity",Account.class); 
q.setParameter("quantity",100); 

em.getTransaction().beginTransaction(); 
q.executeUpdate(); 
em.getTransaction().commit(); 

あなたは、PESSIMISTIC_WRITEINNODB_LOCK_WAIT_TIMEOUT

+0

これは同じ行の同時更新によるものです...データを失わないようにロックする必要があります – Rafihna

関連する問題