diff --git a/odoo/http.py b/odoo/http.py index 90acbbe7cf7..cc26cd80a1f 100644 --- a/odoo/http.py +++ b/odoo/http.py @@ -331,14 +331,18 @@ class WebRequest(object): if self.endpoint.first_arg_is_req: args = (request,) + args + first_time = True + # Correct exception handling and concurency retry @service_model.check def checked_call(___dbname, *a, **kw): + nonlocal first_time # The decorator can call us more than once if there is an database error. In this # case, the request cursor is unusable. Rollback transaction to create a new one. - if self._cr: + if self._cr and not first_time: self._cr.rollback() self.env.clear() + first_time = False result = self.endpoint(*a, **kw) if isinstance(result, Response) and result.is_qweb: # Early rendering of lazy responses to benefit from @service_model.check protection