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