2017-01-08 3 views
0

Я выполняю итерацию по большому набору данных и обновляю каждую строку. Данные заблокированы до тех пор, как его петлями и изменения не сохраняются только его все сделаноТаблица ограничений Grails GOLD при обновлении таблицы DB

Мой код:

В контроллере

stocks.each { stock -> 

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

и метод сохранения в обслуживании является единственным на с @Transactional:

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

ответ

1

Если вы не хотите, что наборы данных заблокированы все время, вы можете создать транзакцию для каждого сохранения:

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

Недостатком является то, что откат всех измененных наборов данных невозможен при ошибках.

+0

При работе в петле. Я получаю: Вызвано: org.springframework.orm.hibernate5.HibernateSystemException: Незаконная попытка связать коллекцию с двумя открытыми сеансами. Коллекция: [xxx.Stock.estimations # 718]; Вложенное исключение - org.hibernate.HibernateException: Незаконная попытка связать коллекцию с двумя открытыми сеансами. – Torsten

+0

Хорошо, похоже, что Stock имеет отношение «ко многим» к «оценкам» и что оценки связаны с другим сеансом. Вы можете приложить все оценки к новой транзакции. Или вы можете называть «merge()» вместо «save()». Может быть, это может помочь. – gregorr

Смежные вопросы