2017-01-08 3 views
0

大きなデータセットを繰り返し処理して各行を更新しています。 データは、そのループの限り、ロックされ、変更はそのすべてになるまで保存されませんマイコードGrails GORMはDBテーブルの更新時にテーブルをロックします

行わ:

コントローラ

stocks.each { stock -> 

     def s = stockService.updateData(stock) 
     stockService.save s 
    } 

とサービスで保存する方法があるだけで

@Transactional 
private void save(Stock stock) { 
    stock.save(failOnError: true, flush: true) 
} 

答えて

1

あなたがデータセット全体の時間をロックされていることをたくない場合は、各保存のためのトランザクションを作成することができます:@Transactional付きで

private void save(Stock stock) { 
    Stock.withNewTransaction { 
     stock.attach() 
     stock.save() 
    } 
} 

欠点は、エラーではすべての変更されたデータセットのロールバックができないことです。

+0

ループで実行する場合。私は取得します: 原因:org.springframework.orm.hibernate5.HibernateSystemException:2つの開いているセッションとコレクションを関連付ける試みが正しくありません。コレクション:[xxx.Stock.estimations#718];ネストされた例外はorg.hibernate.HibernateExceptionです:2つの開いているセッションにコレクションを関連付ける試みが正しくありません。 – Torsten

+0

[OK]のように、在庫は「見積もり」と「多対多」の関係にあり、見積もりは他のセッションにバインドされているようです。 新しいトランザクションにすべての見積もりを添付することができます。または、 "save()"の代わりに "merge()"を呼び出すこともできます。多分それが助けになるかもしれない。 – gregorr

関連する問題