Python 以编程方式在plone上创建内容类型时,time.time()是一种安全的方法吗?

Python 以编程方式在plone上创建内容类型时,time.time()是一种安全的方法吗?,python,time,plone,race-condition,collision,Python,Time,Plone,Race Condition,Collision,我必须在Plone上使用\u createObjectByType。我将对象的id作为参数。在这种情况下,基于time.time()创建id以避免冲突是否安全?两个请求是否具有完全相同的时间戳,如time.time()所示?这样做是完全安全的,即使在不太可能的情况下,两个请求在完全相同的时间被处理,如果发生冲突,ZODB将引发ConflictError并重试您的请求 对以下讨论作出答复: 在一台计算机上,根据定义,两个事务必须重叠(每个线程中的time.time()结果相同。)ZODB是MVCC

我必须在Plone上使用
\u createObjectByType
。我将对象的
id
作为参数。在这种情况下,基于
time.time()
创建id以避免冲突是否安全?两个请求是否具有完全相同的时间戳,如
time.time()
所示?

这样做是完全安全的,即使在不太可能的情况下,两个请求在完全相同的时间被处理,如果发生冲突,ZODB将引发ConflictError并重试您的请求

对以下讨论作出答复:

在一台计算机上,根据定义,两个事务必须重叠(每个线程中的time.time()结果相同。)ZODB是MVCC,因此每个线程都可以看到事务开始时数据库的一致视图。当第二个线程提交时,将引发冲突错误,因为它将写入自事务开始以来已更改的对象

如果客户端在多台计算机上运行,则需要考虑客户端之间时钟漂移的可能性。对于其事务id,ZODB选择当前时间戳或最后一个事务id+1中的较大值


但是,也许您应该考虑不使用时间戳作为ID,因为它会导致在重载下发生冲突,因为所有请求都希望在同一BTHEAR桶中创建条目。随机选取ID将消除几乎所有的冲突,但会导致无效填充的B树。建议的方法是,每个创建对象的线程从数字空间中的一个随机点开始,然后依次创建ID。如果它发现一个id已经被使用,那么它应该在数字空间中随机选择另一个点,然后从那里重新开始。我相信zope.intid包含了这个策略的一个实现。

这样做是完全安全的,即使在不太可能的情况下,两个请求完全同时处理,如果发生冲突,ZODB将引发一个ConflictError并重试您的请求

对以下讨论作出答复:

在一台计算机上,根据定义,两个事务必须重叠(每个线程中的time.time()结果相同。)ZODB是MVCC,因此每个线程都可以看到事务开始时数据库的一致视图。当第二个线程提交时,将引发冲突错误,因为它将写入自事务开始以来已更改的对象

如果客户端在多台计算机上运行,则需要考虑客户端之间时钟漂移的可能性。对于其事务id,ZODB选择当前时间戳或最后一个事务id+1中的较大值


但是,也许您应该考虑不使用时间戳作为ID,因为它会导致在重载下发生冲突,因为所有请求都希望在同一BTHEAR桶中创建条目。随机选取ID将消除几乎所有的冲突,但会导致无效填充的B树。建议的方法是,每个创建对象的线程从数字空间中的一个随机点开始,然后依次创建ID。如果它发现一个id已经被使用,那么它应该在数字空间中随机选择另一个点,然后从那里重新开始。我相信zope.intid包含了这个策略的一个实现。

我一直在思考冲突错误:如果它被提出,它为什么会重试请求?请求没有丢失吗?没有,Plone(实际上是Zope)会重试,因为存在冲突错误,所以请求不会丢失,因为Zope是处理请求的人。我怀疑您是否会遇到冲突错误情况。相反,一个请求将收到一个关于该ID已在使用的异常。Laurence是对的。使用time.time()时,只有当两个请求同时发生时,才能发生冲突。这将导致冲突错误。@Sentinel:完全正确。我很害怕。我以前遇到过这个问题(但没有使用time.time())。我想知道time.time()在plone中拥有唯一ID的可靠性。我一直在思考冲突错误:如果引发冲突,它为什么会重试请求?请求没有丢失吗?没有,Plone(实际上是Zope)会重试,因为存在冲突错误,所以请求不会丢失,因为Zope是处理请求的人。我怀疑您是否会遇到冲突错误情况。相反,一个请求将收到一个关于该ID已在使用的异常。Laurence是对的。使用time.time()时,只有当两个请求同时发生时,才能发生冲突。这将导致冲突错误。@Sentinel:完全正确。我很害怕。我以前遇到过这个问题(但没有使用time.time())。我想知道time.time()在plone中拥有唯一ID的可靠性。