2024-09-29 01:23:07 发布
网友
我必须在Plone上使用_createObjectByType。我将对象的id作为参数。在这种情况下,基于time.time()创建一个id以避免冲突安全吗?两个请求是否可以具有完全相同的时间戳,如time.time()所示?你知道吗
_createObjectByType
id
time.time()
这样做是非常安全的,即使在两个请求完全同时处理的情况下,如果发生冲突,ZODB将引发confliciterror并重试您的请求。你知道吗
回应以下讨论:
在一台计算机上,两个事务必须重叠(从时间。时间()在每个线程中。)ZODB是MVCC,因此每个线程都可以看到事务开始时数据库的一致视图。当第二个线程提交时,将引发冲突错误,因为它将写入自事务开始以来已更改的对象。你知道吗
如果您的客户端在多台计算机上运行,那么您需要考虑客户端之间时钟漂移的可能性。对于事务id,ZODB选择当前时间戳或上一个事务id+1中的较大者。你知道吗
但是,也许您应该考虑根本不使用时间戳作为id,因为它会导致重载下的冲突,因为所有请求都希望在同一BTree bucket中创建条目。随机选择ID将消除几乎所有的冲突,但会导致无效的B树填充。建议的方法是,每个创建对象的线程从数字空间中的一个随机点开始,依次创建id。如果它发现一个id已经被使用了,那么它应该在数字空间中随机选取另一个点并从那里重新开始。我相信佐佩·因蒂德包含此策略的实现。你知道吗
这样做是非常安全的,即使在两个请求完全同时处理的情况下,如果发生冲突,ZODB将引发confliciterror并重试您的请求。你知道吗
回应以下讨论:
在一台计算机上,两个事务必须重叠(从时间。时间()在每个线程中。)ZODB是MVCC,因此每个线程都可以看到事务开始时数据库的一致视图。当第二个线程提交时,将引发冲突错误,因为它将写入自事务开始以来已更改的对象。你知道吗
如果您的客户端在多台计算机上运行,那么您需要考虑客户端之间时钟漂移的可能性。对于事务id,ZODB选择当前时间戳或上一个事务id+1中的较大者。你知道吗
但是,也许您应该考虑根本不使用时间戳作为id,因为它会导致重载下的冲突,因为所有请求都希望在同一BTree bucket中创建条目。随机选择ID将消除几乎所有的冲突,但会导致无效的B树填充。建议的方法是,每个创建对象的线程从数字空间中的一个随机点开始,依次创建id。如果它发现一个id已经被使用了,那么它应该在数字空间中随机选取另一个点并从那里重新开始。我相信佐佩·因蒂德包含此策略的实现。你知道吗
相关问题 更多 >
编程相关推荐