在从作业中创建 pos 时,由于并发更新而无法序列化访问
Posted
技术标签:
【中文标题】在从作业中创建 pos 时,由于并发更新而无法序列化访问【英文标题】:could not serialize access due to concurrent update while creating pos picking from a job 【发布时间】:2020-06-21 12:29:07 【问题描述】:受影响的版本: 12.0
重现步骤: 我进行了自定义以推迟创建 pos 订单拣货 并将任务委托给工作 有时我会收到以下错误
当前行为: 2020-06-18 17:49:24,588 1370 错误 cafe9.rabeh.io odoo.addons.base.models.ir_cron:来自 cron POS 订单的调用:处理服务器操作 #610 的待处理订单在作业 #24 中失败 Traceback(最近一次调用最后一次):
文件“/opt/rabeh/odoo/odoo/addons/base/models/ir_cron.py”,第 102 行,在 _callback self.env['ir.actions.server'].browse(server_action_id).run()
文件“/opt/rabeh/odoo/odoo/addons/base/models/ir_actions.py”,第 569 行,运行中 res = func(action, eval_context=eval_context)
文件“/opt/rabeh/odoo/odoo/addons/base/models/ir_actions.py”,第 445 行,在 run_action_code_multi safe_eval(action.sudo().code.strip(), eval_context, mode="exec", nocopy=True) # nocopy 允许返回“动作”
文件“/opt/rabeh/odoo/odoo/tools/safe_eval.py”,第 350 行,在 safe_eval return unsafe_eval(c, globals_dict, locals_dict)
文件“/opt/rabeh-12/rabeh_addons/pos_pending_session/models/pos_order.py”,第 68 行,在 pending_picking_creation po_order.create_picking()
文件“/opt/rabeh-12/rabeh_addons/pos_pending_session/models/pos_order.py”,第 36 行,在 create_picking res = super(PosOrder, orders).create_picking()
文件“/opt/rabeh/odoo/addons/point_of_sale/models/pos_order.py”,第 841 行,在 create_picking order._force_picking_done(order_picking)
文件“/opt/rabeh/odoo/addons/point_of_sale/models/pos_order.py”,第 856 行,在 _force_picking_done Picking.action_done()
文件“/opt/rabeh/odoo/addons/stock/models/stock_picking.py”,第 631 行,在 action_done todo_moves._action_done()
文件“/opt/rabeh/odoo/addons/purchase_stock/models/stock.py”,第 96 行,在 _action_done res = super(StockMove, self)._action_done()
文件“/opt/rabeh/odoo/addons/stock_account/models/stock.py”,第 389 行,在 _action_done res = super(StockMove, self)._action_done()
文件“/opt/rabeh/odoo/addons/stock/models/stock_move.py”,第 1137 行,在 _action_done move_todo.mapped('move_line_ids')._action_done()
文件“/opt/rabeh/odoo/addons/stock/models/stock_move_line.py”,第 445 行,在 _action_done Quant._update_available_quantity(ml.product_id, ml.location_dest_id, 数量, lot_id=ml.lot_id, package_id=ml.result_package_id, owner_id=ml.owner_id, in_date=in_date)
文件“/opt/rabeh/odoo/addons/stock/models/stock_quant.py”,第 216 行,在 _update_available_quantity self._cr.execute("SELECT 1 FROM stock_quant WHERE id = %s FOR UPDATE NOWAIT", [quant.id], log_exceptions=False)
文件“/opt/rabeh/odoo/odoo/sql_db.py”,第 148 行,在包装器中 返回 f(self, *args, **kwargs)
文件“/opt/rabeh/odoo/odoo/sql_db.py”,第 225 行,在执行中 res = self._obj.execute(查询,参数)
psycopg2.errors.SerializationFailure:由于并发更新,无法序列化访问
预期行为: 我认为这条线应该生成无法获得锁 我只是想知道它何时会生成“由于并发更新而无法序列化访问”
【问题讨论】:
【参考方案1】:它可能已经获得了锁,因为锁当前可用。但它已在与当前事务的快照重叠的某个先前点被锁定。因此获得锁是可能的,但如果要获得它会产生序列化问题。将其报告为序列化失败似乎是正确的结果。
在隔离级别较高的事务中使用 FOR UPDATE NOWAIT 似乎不一致,或者至少是不必要的。你希望通过这样做来实现什么?您对“在从工作中挑选职位时”的描述并没有为我阐明这一点。这是 odoo 特有的行话吗?
【讨论】:
以上是关于在从作业中创建 pos 时,由于并发更新而无法序列化访问的主要内容,如果未能解决你的问题,请参考以下文章
在 Dataflow 中创建作业时出错(当前用户不能充当服务帐户)
SQL作业sql ssis作业错误:“由于错误0xC0010014导致程序包无法加载,这在CPackage :: LoadFROMXML失败时会发生