Grails с плагином GORM MongoDB: org.grails.datastore.mapping.core.OptimisticLockingException

У меня есть задание, которое будет запускаться каждые несколько минут, создается новый объект домена и заполняется данными из вызова API, а затем вызывается.save() для фиксации в базе данных.

Это приложение использует плагин GORM Mongo.

После развертывания новой войны на испытательном стенде я получил org.grails.datastore.mapping.core.OptimisticLockingException каждый раз, когда задание запускалось и пыталось обработать файл, сделать вызов API, а затем сохранить результаты. Журнал (&error) указывает на вызов.save().

Ошибка выдавалась после того, как журнал показал "Анализ файла"

log.debug "Parsing file contents"
def map = [:]
def contents = new CsvParser().parse(fileContents, separator: '\t')
//Make a map of CSV contents
contents.each{ line ->
   map[line["name"]] = [:]
   line.columns.each{
      map[line["name"]][it.key[0].toLowerCase()+it.key.substring(1)]=line[it.key]
   }
   def thing = apiService.findThingDetailsByThingId(line["Thing_ID"].replaceAll( "[^\\d]", "" ))
   thing.save()
   map[line["name"]].putAll(thing.toMap())
}

Приведенная ниже трассировка стека, вероятно, излишняя.

Heuristic completion: outcome state is rolled back; nested exception is org.springframework.transaction.TransactionSystemException: Could not commit Datastore transaction; nested exception is org.grails.datastore.mapping.core.OptimisticLockingException: The instance was updated by another user while you were editing
org.springframework.transaction.HeuristicCompletionException: Heuristic completion: outcome state is rolled back; nested exception is org.springframework.transaction.TransactionSystemException: Could not commit Datastore transaction; nested exception is org.grails.datastore.mapping.core.OptimisticLockingException: The instance was updated by another user while you were editing
   at org.grails.datastore.gorm.GormStaticApi.withNewSession(GormStaticApi.groovy:756)
   at grails.plugins.quartz.GrailsJobFactory$GrailsJob.execute(GrailsJobFactory.java:102)
   at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
   at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)
Caused by: org.springframework.transaction.TransactionSystemException: Could not commit Datastore transaction; nested exception is org.grails.datastore.mapping.core.OptimisticLockingException: The instance was updated by another user while you were editing
   at org.grails.datastore.mapping.transactions.DatastoreTransactionManager.doCommit(DatastoreTransactionManager.java:156)
   ... 8 more
Caused by: org.grails.datastore.mapping.core.OptimisticLockingException: The instance was updated by another user while you were editing
   at org.grails.datastore.mapping.mongo.engine.MongoEntityPersister$5.doInDB(MongoEntityPersister.java:664)
   at org.grails.datastore.mapping.mongo.engine.MongoEntityPersister.updateEntry(MongoEntityPersister.java:625)
   at org.grails.datastore.mapping.mongo.engine.MongoEntityPersister.updateEntry(MongoEntityPersister.java:82)
   at org.grails.datastore.mapping.engine.NativeEntryEntityPersister$2.run(NativeEntryEntityPersister.java:862)
   at org.grails.datastore.mapping.core.impl.PendingOperationExecution.executePendingOperation(PendingOperationExecution.java:33)
   at org.grails.datastore.mapping.core.AbstractSession.flushPendingOperations(AbstractSession.java:364)
   at org.grails.datastore.mapping.core.AbstractSession.flushPendingUpdates(AbstractSession.java:343)
   at org.grails.datastore.mapping.core.AbstractSession.flush(AbstractSession.java:263)
   at org.grails.datastore.mapping.mongo.MongoSession.flush(MongoSession.java:126)
   at org.grails.datastore.mapping.transactions.DatastoreTransactionManager.doCommit(DatastoreTransactionManager.java:151)
   ... 8 more
org.springframework.transaction.HeuristicCompletionException: Heuristic completion: outcome state is mixed; nested exception is org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only
   at org.grails.datastore.gorm.GormStaticApi.withNewSession(GormStaticApi.groovy:756)
   at grails.plugins.quartz.GrailsJobFactory$GrailsJob.execute(GrailsJobFactory.java:102)
   at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
   at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)
Caused by: org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only
   ... 6 more

После попытки перезапуска tomcat, проверки соединений Монго и т. Д. Я решил эту проблему, отбросив коллекции монго объекта домена (недавно я сделал несколько изменений в объектах домена). Возможно ли, что эта ошибка вызвана изменениями в доменном объекте и конфликтом модели данных Монго /GORM? Если так, как я могу избежать необходимости отбрасывать коллекции в будущем?

Я не верю, что было возможно, что что-то еще получало доступ к той же коллекции доменов, и поэтому не думаю, что это было исключение оптимистичной блокировки, но если бы это было так, какие команды я мог бы запустить на стороне Монго, чтобы увидеть, какие соединения Доступ к этой коллекции?

0 ответов

Другие вопросы по тегам