更新记录时不进行并发检查

时间:2013-09-23 13:34:44

标签: openerp

任何时候只有一个用户应该能够编辑合同。如果另一个用户试图编辑记录,我们需要弹出一个对话框,其中包含打开记录的用户的详细信息。

这个显而易见的功能似乎不是OpenERP原生的。

是否有一个模块可以在整个系统中实现这一点?

任何时候只有一个用户应该能够编辑合同。如果另一个用户试图编辑记录,我们需要弹出一个对话框,其中包含打开记录的用户的详细信息。然后应该阻止第二个用户编辑记录,直到它被解锁(即第一个用户保存或丢弃记录)。

奇怪的是,记录锁定不是默认的Openerp架构的一部分 - 你知道为什么吗?

我们可以看看我们如何实现这一点并回过头来提出一些想法。目前这不是一个优先考虑的问题,但只要有一个/两个用户“发现”这个问题就会立即生效。

1 个答案:

答案 0 :(得分:3)

OpenERP框架 支持并发控制,以防止由于同时修改相同文档而导致数据丢失,即使这不是常见问题(请参阅下面的原因)。

此机制通过Optimistic Concurrency Control (OCC)实现,自Ope​​nERP 5.0起存在。悲观锁定不是一种选择,在无状态的基于Web的环境中(用户可以随时离开他们的桌面)是非常不切实际的,并且在资源争用方面通常是一个糟糕的解决方案。大多数具有并发控制机制的现代框架都使用OCC(Rails,Google App Engine等)

警告:OpenERP 7.0中存在一个突出的错误,导致Web界面跳过此机制并忽略并发编辑冲突。框架支持就在那里,可以由自定义客户端使用。

实施

OpenERP的OCC实现依赖于使用虚拟__last_update字段,客户端可以在任何模型上明确地作为常规read()调用的一部分进行请求。默认情况下,该值是从框架在任何记录上维护的write_datecreate_date字段自动推断的。 当客户端稍后对同一记录进行write()调用时,它可以传递包含原始__last_update值的额外上下文结构,如果记录已更新,系统将自动引发错误。与此同时。有关详细信息,请参阅_check_concurrency()方法。

当发生这种情况时,客户端堆栈可以适当地做出反应,例如通过显示记录详细信息并询问用户他是否要强制更新(在这种情况下,__last_update值可以简单地更新)或者放弃她当地的变化。

实际使用

在实践中,案例进行这样的并发检查是非常罕见的。业务文档可分为两类:主数据(合作伙伴,产品等)记录是长期存在的对象,vs 运营数据(发票,采购订单,等),短期工作流支持的对象。

操作数据记录通常由一个负责的用户一次管理,创建后他们主要接收工作流状态更新和新的历史记录日志条目,这些条目对于并发更新是安全的(一切都是事务性的)。

主数据记录更有可能接收并发更新,但由于OpenERP客户端仅保存实际已修改的字段,因此实际上冲突的可能性非常有限。

此外,OCC机制是按记录而不是按字段,因此它倾向于阻止不一定冲突的编辑(例如针对不同字段,或者在多值字段中添加额外值)。

一般情况下,用户倾向于在一段时间后忽略并发错误,并且如果客户端提供该解析选项,则会在“强制更新”上意外点击,进一步降低其实用性......