ReadConflictError во время длительной транзакции на plone 4.1

У нас есть длинный запрос, который выполняет поиск по каталогу, затем вычисляет некоторую информацию и затем сохраняет ее в другом документе. Вызов Do выполняется для индексации документа после сохранения.

В журналах мы получаем такие ошибки, как INFO ZPublisher.Conflict ConflictError at /pooldb/csvExport/runAgent: ошибка конфликта базы данных (oid 0x017f1eae, класс BTrees.IIBTree.IISet, серийный номер этого txn начинается с 0x03a30beb4659b266 2013-11-27 23: 07:16.488370, серийный номер в настоящее время зафиксирован 0x03a30c0d2ca5b9aa 27-11-2013 23:41:10.464226) (19 конфликтов (0 неразрешенных) с момента запуска в понедельник, 25 ноября, 15:59:08 2013 г.), и транзакция прерывается и перезапускается.

Во всей документации, которую я читал, говорится, что из-за MVVC в ZODB ReadConflicts больше не возникает. Поскольку это написано на RestrictedPython, установка точки сохранения не является простым вариантом (но, вероятно, мой единственный выбор, я думаю).

Есть ли другой способ избежать этого конфликта? Если мне нужно использовать точки сохранения, может ли кто-нибудь придумать причину безопасности, почему я не должен вносить в белый список метод транзакции точки сохранения для использования в PythonScripts?


person djay    schedule 28.11.2013    source источник
comment
Это конфликт чтения? Не может ли быть так, что переиндексация не проходит из-за того, что во время поиска + вычисления было переиндексировано что-то еще?   -  person Lennart Regebro    schedule 28.11.2013
comment
Ты прав. Его путали с более ранним ReadConflictError. Мы до сих пор не уверены, что здесь пишет, но что-то явно   -  person djay    schedule 03.12.2013


Ответы (1)


Ответ заключается в том, что на самом деле невозможно выполнить большую транзакцию, включающую запись, когда в то же время существуют другие небольшие транзакции для тех же объектов. Предполагается, что у BTree есть специальный код обработки конфликтов, но, похоже, он не работает в тех случаях, с которыми я имею дело.

Я думаю, что единственный способ справиться с этим - что-то вроде этот код, который ломает переиндексировать в более мелкие транзакции, чтобы уменьшить вероятность конфликта. Что-то подобное действительно должно быть встроено в zope/plone.

person djay    schedule 19.02.2014