How to Implement rollback() in Odoo?
✅ What is rollback()?
In Odoo, rollback() is a low-level PostgreSQL transaction control method used to discard uncommitted changes made in the current database cursor (self.env.cr).
It is especially useful when:
- An operation must not persist in the database.
- You are manually handling exceptions or validations.
- External integrations fail and partial changes should be undone.
🔧 Technical Definition
self.env.cr.rollback()
- cr is the database cursor.
- rollback() tells PostgreSQL to discard all changes since the last commit.
⚠️ Important Notes
- It does not raise an exception — it silently rolls back.
- Use with caution, as it rolls back the entire transaction, including unrelated changes in the current request lifecycle.
✅ Realistic Example in Odoo
Scenario: External API Fails
You are pushing an invoice to a third-party service. If the API call fails, you rollback the transaction so nothing is saved in Odoo either.
class AccountMove(models.Model):
_inherit = 'account.move'
def action_post(self):
res = super().action_post()
for invoice in self:
try:
# Call external API
response = requests.post('https://api.example.com', json={
'invoice_number': invoice.name,
'amount': invoice.amount_total
})
if response.status_code != 200:
raise Exception("Failed to sync with external system.")
except Exception as e:
_logger.error(f"API Sync Failed: {str(e)}")
self.env.cr.rollback() # Revert invoice posting
raise UserError("Invoice sync failed. Transaction cancelled.")
return res
- 🎯 In this example, if the external call fails, Odoo's action_post() effect is undone using rollback().
- Don’t mix rollback() with ORM operations carelessly.
- Avoid in multi-record operations unless you intend to rollback everything.
🧠 When to Use
Use Case | Use rollback()? |
External API failed | ✅ Yes |
Custom validations failed | ✅ Yes |
Soft errors (no rollback needed) | ❌ No |
Standard ORM logic | ❌ No (ORM handles rollback on error) |
❗️ Caution
✅ Summary
Feature | Description |
Purpose | Discard uncommitted DB changes |
Scope | Entire current DB transaction |
Use With | self.env.cr.rollback() |
Typical Use Case | API failure, custom validations, external syncs |