Transactions 在运行transmogrifier管道时,如何向ZODB提交子事务?

Transactions 在运行transmogrifier管道时,如何向ZODB提交子事务?,transactions,plone,data-migration,zodb,transmogrifier,Transactions,Plone,Data Migration,Zodb,Transmogrifier,我正在使用transmogrifier管道将内容导入Plone,但有时会出现一些问题,并可能引发异常。当这种情况发生时,我需要重新启动整个流程,因为事务已完全中止。对于一批超过100000件的产品来说,这是不可接受的 我正在使用该部分,但它仅通过使用transaction.savepoint(optimistic=True)设置保存点 我想知道这样一个新的部分是否能帮助我解决这个问题: 来自zope.interface导入类提供、实现 从collective.transmogrifier.int

我正在使用transmogrifier管道将内容导入Plone,但有时会出现一些问题,并可能引发异常。当这种情况发生时,我需要重新启动整个流程,因为事务已完全中止。对于一批超过100000件的产品来说,这是不可接受的

我正在使用该部分,但它仅通过使用
transaction.savepoint(optimistic=True)
设置保存点

我想知道这样一个新的部分是否能帮助我解决这个问题:

来自zope.interface导入类提供、实现
从collective.transmogrifier.interfaces导入ISectionBlueprint
从collective.transmogrifier.interfaces导入ISection
进口交易
类CommitSection(对象):
类提供(ISectionBlueprint)
机具(ISection)
def _;初始(自身、transmogrifier、名称、选项、上一个):
self.every=int(options.get('every',1000))
self.previous=先前
定义(自我):
计数=0
对于self.previous中的项目:
计数=(计数+1)%self.every
如果计数=0:
commit()事务
收益项目

我想是的,下面的代码来自collective.jsonmigrator.partialcommit,它对我来说一直都很好。
当然,您可以导入collective.jsonmigrator&使用该蓝图,而不是编写自己的蓝图

class PartialCommit(object):

    classProvides(ISectionBlueprint)
    implements(ISection)

    def __init__(self, transmogrifier, name, options, previous):
        self.previous = previous
        self.step = int(options.get('every', 100))

    def __iter__(self):
        count = 1
        for item in self.previous:
            yield item
            if count % self.step == 0:
                transaction.commit()
            count += 1