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

标签 odoo

任何时候只有一名用户能够编辑契约(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_datecreate_date 字段自动推断出来的。 当客户稍后发出write()时调用同一条记录时,它可以传递一个包含原始 __last_update 值的额外上下文结构,如果记录同时更新,系统将自动引发错误。请参阅_check_concurrency()方法了解更多详细信息。

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

实际使用

实际上,这种并发检查有用的情况非常罕见。业务文档可以分为两类:主数据(合作伙伴、产品等)记录是长期存在的对象,操作数据(发票、采购订单、等),短期工作流支持的对象。

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

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

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

一般来说,用户在一段时间后往往会忽略并发错误,并且如果客户端提供该解决方案选项,他们会心不在焉地点击“强制更新”,从而进一步降低其实用性...

关于odoo - 更新记录时不进行并发检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18960668/

相关文章:

javascript - Openerp javascript 调试

c# - 如何使用 C# 代码连接或登录 Odoo?在与 Odoo 连接后,如何从 C# 向 Odoo 数据库添加自定义字段?

odoo - 生成html并在qweb中渲染

python - 功能字段 odoo 类型 float ,新 api

python - groupby 在搜索 View 中的多对多关系字段上?

python - 如何在odoo中根据另一个Many2one字段的值过滤一个Many2one字段

python - Odoo - 获取记录并将其转换为 python 对象

xml - odoo 8/open erp 中的依赖下拉列表

python - 通过 bool 复选标记激活表单中的字段 - Odoo v8

javascript - 仅包含特定 View 类型的 javascript 代码