任何时候只有一名用户能够编辑契约(Contract)。如果其他用户尝试编辑该记录,我们需要弹出一个对话框,其中包含打开该记录的用户的详细信息。
这个明显的功能似乎并不是 OpenERP 原生的。
是否有一个模块可以在整个系统中实现这一点?
任何时候只有一名用户能够编辑契约(Contract)。如果其他用户尝试编辑记录,我们需要弹出一个对话框,其中包含打开该记录的用户的详细信息。然后,应阻止第二个用户编辑记录,直到解锁(即第一个用户保存或丢弃记录)。
记录锁定不是默认 Openerp 架构的一部分,这似乎很奇怪 - 你知道为什么吗?
我们能否看看如何实现这一点并提出一些想法。目前这不是一个紧迫的优先事项,但一旦一两个用户“发现”这个问题就会成为当务之急。
最佳答案
OpenERP 框架确实支持并发控制,以防止由于同一文档的并发修改而导致数据丢失,即使这不是一个常见问题(请参阅下面的原因)。
该机制是通过 Optimistic Concurrency Control (OCC) 实现的,自 OpenERP 5.0 起就存在。悲观锁定不是一种选择,在无状态的基于 Web 的环境中(用户可以随时离开办公 table )非常不切实际,并且在资源争用方面通常是一个糟糕的解决方案。大多数具有并发控制机制的现代框架都使用 OCC(Rails、Google App Engine 等)
警告:OpenERP 7.0 目前存在一个突出的错误,导致 Web 界面跳过此机制并忽略并发编辑冲突。不过,框架支持已经存在并且可以由自定义客户端使用。
实现
OpenERP 的 OCC 实现依赖于虚拟 __last_update
字段的使用,客户端可以将其作为常规的一部分显式请求 read()
任何型号的电话。该值是从框架默认在任何记录上维护的 write_date
和 create_date
字段自动推断出来的。
当客户稍后发出write()
时调用同一条记录时,它可以传递一个包含原始 __last_update
值的额外上下文结构,如果记录同时更新,系统将自动引发错误。请参阅_check_concurrency()
方法了解更多详细信息。
当发生这种情况时,客户端堆栈可以做出适当的 react ,例如通过显示记录详细信息并询问用户她想要强制更新(在这种情况下,__last_update
值可以简单地被更新)或放弃她的本地更改。
实际使用
实际上,这种并发检查有用的情况非常罕见。业务文档可以分为两类:主数据(合作伙伴、产品等)记录是长期存在的对象,操作数据(发票、采购订单、等),短期工作流支持的对象。
操作数据记录通常一次由一个负责的用户管理,创建后它们主要接收工作流状态更新和新的历史日志条目,这对于并发更新是安全的(一切都是事务性的)。
主数据记录更有可能接收并发更新,但由于 OpenERP 客户端仅保存实际修改的字段,因此在实践中发生冲突的可能性非常有限。
此外,OCC 机制是针对每个记录的,而不是针对每个字段的,因此它往往会阻止不一定会发生冲突的编辑(例如,针对不同的字段,或者在多值字段中添加额外的值)。
一般来说,用户在一段时间后往往会忽略并发错误,并且如果客户端提供该解决方案选项,他们会心不在焉地点击“强制更新”,从而进一步降低其实用性...
关于odoo - 更新记录时不进行并发检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18960668/