Python psycopg2.extensions.TransactionRollbackError:由于并发更新,无法序列化访问

Python psycopg2.extensions.TransactionRollbackError:由于并发更新,无法序列化访问,python,postgresql,odoo,Python,Postgresql,Odoo,我对TransactionRollbackError有一个问题:更新表时由于并发更新而无法序列化访问。我在odoo V13中使用postgres,在使用write()更新具有特定记录集和上下文的池时发生此问题方法。我正在将代码从odoo v7迁移到v13我可以在odoo v7中看到相同的工作,没有任何问题。我没有看到语法错误,但我仍然明白这一点。我只是想了解这是版本中的错误还是与任何数据的并发相关 我有一行代码,这是一个函数的一部分。 self.env.get('pk.status')。浏览(p

我对
TransactionRollbackError有一个问题:更新表时由于并发更新而无法序列化访问。我在odoo V13中使用postgres,在使用
write()更新具有特定记录集和上下文的池时发生此问题
方法。我正在将代码从
odoo v7迁移到v13
我可以在odoo v7中看到相同的工作,没有任何问题。我没有看到语法错误,但我仍然明白这一点。我只是想了解这是版本中的错误还是与任何数据的并发相关

我有一行代码,这是一个函数的一部分。
self.env.get('pk.status')。浏览(pk\u id)。使用上下文(audit\u log=True)。写入(update\u vals)

我有一个名为
pk.status
的模型,它有属性
write(self,update\u vals)
,根据它必须运行
x1(update\u vals)
的条件,如下所示

def x1(self,update_vals):

    product_pool = self.env.get('pk.product')
    if update_vals:
        if isinstance(update_vals, int):
            update_vals = [update_vals]
        for bs_obj in self.browse(update_vals).read(['End_Date']):
            product_ids = product_pool.search([('id_pk_status', '=', bs_obj['id']),
                                                                         ('is_active', '=', 'Y')])
            if product_ids:
                end_date = bs_obj['End_Date'] or date.today()
                force_update = self._context.get('force_update', False)
                product_ids.with_context(audit_log=True,force_update=force_update).write(
                    {'is_active': 'N', 'end_date': end_date})
Product\u id
记录集具有
写入(self,val)
功能,用于
'pk.Product'
模型。 作为write()的一部分,其条件将执行x2()

执行该行时出错

status\u obj=status\u pool.browse(VAL['id\u pk\u status]).read()[0]

完全错误:

2020-08-09 15:39:11,303 4224 ERROR ek_openerp_dev odoo.sql_db: bad query: UPDATE "pk_status" SET "Is_Active"='N',"write_uid"=1,"write_date"=(now() at time zone 'UTC') WHERE id IN (283150)
ERROR: could not serialize access due to concurrent update
 
Traceback (most recent call last):
  File "/current/addons/models/pk_product.py", line 141, in x2()
    status_obj = status_pool.browse(vals['id_pk_status']).read()[0]
  File "/current/core/addons/nest_migration_utils/helpers/old_cr.py", line 51, in old_cursor
    result = method(*args, **kwargs)
  File "/current/odoo/odoo/models.py", line 2893, in read
    self._read(stored_fields)
  File "/current/odoo/odoo/models.py", line 2953, in _read
    self.flush(fields, self)
  File "/current/odoo/odoo/models.py", line 5419, in flush
    process(self.env[model_name], id_vals)
  File "/current/odoo/odoo/models.py", line 5374, in process
    recs._write(vals)
  File "/current/odoo/odoo/models.py", line 3619, in _write
    cr.execute(query, params + [sub_ids])
  File "/current/odoo/odoo/sql_db.py", line 163, in wrapper
    return f(self, *args, **kwargs)
  File "/current/odoo/odoo/sql_db.py", line 240, in execute
    res = self._obj.execute(query, params)
psycopg2.extensions.TransactionRollbackError: could not serialize access due to concurrent update

我假设错误中的并发状态是,我在一个线程中执行两个写操作,但我对此不确定。希望这有帮助。

每个子流程都需要与数据库建立全局连接。如果使用的是
Pool
,则可以定义创建全局连接和光标的函数,并将其传递给
初始值设定项
参数。如果您使用的是
进程
对象,那么我建议您创建一个连接,并通过队列或管道传递数据


正如Klaver所说,如果你能提供代码以获得更准确的答案,那就更好了。

你需要提供导致错误的代码,否则这个问题就不会有任何结果。@Adriankaver我已经添加了关于错误的完整详细信息的代码,我看到的是:
status\u pool.browse(vals['id\u pk\u status]).read()
。特别是引用
id\u pk\u status
时缺少了一个“参数”。这是编辑过程中我的遗漏。但在我的代码中,引号是好的,这根本不是问题所在。我只是想知道错误的状态。@Sebastain我已经添加了关于错误的完整细节的代码
2020-08-09 15:39:11,303 4224 ERROR ek_openerp_dev odoo.sql_db: bad query: UPDATE "pk_status" SET "Is_Active"='N',"write_uid"=1,"write_date"=(now() at time zone 'UTC') WHERE id IN (283150)
ERROR: could not serialize access due to concurrent update
 
Traceback (most recent call last):
  File "/current/addons/models/pk_product.py", line 141, in x2()
    status_obj = status_pool.browse(vals['id_pk_status']).read()[0]
  File "/current/core/addons/nest_migration_utils/helpers/old_cr.py", line 51, in old_cursor
    result = method(*args, **kwargs)
  File "/current/odoo/odoo/models.py", line 2893, in read
    self._read(stored_fields)
  File "/current/odoo/odoo/models.py", line 2953, in _read
    self.flush(fields, self)
  File "/current/odoo/odoo/models.py", line 5419, in flush
    process(self.env[model_name], id_vals)
  File "/current/odoo/odoo/models.py", line 5374, in process
    recs._write(vals)
  File "/current/odoo/odoo/models.py", line 3619, in _write
    cr.execute(query, params + [sub_ids])
  File "/current/odoo/odoo/sql_db.py", line 163, in wrapper
    return f(self, *args, **kwargs)
  File "/current/odoo/odoo/sql_db.py", line 240, in execute
    res = self._obj.execute(query, params)
psycopg2.extensions.TransactionRollbackError: could not serialize access due to concurrent update