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? Если так, как я могу избежать необходимости отбрасывать коллекции в будущем?
Я не верю, что было возможно, что что-то еще получало доступ к той же коллекции доменов, и поэтому не думаю, что это было исключение оптимистичной блокировки, но если бы это было так, какие команды я мог бы запустить на стороне Монго, чтобы увидеть, какие соединения Доступ к этой коллекции?