From dd1f3af722157b61fff69adaec11fc3ea8e29dfe Mon Sep 17 00:00:00 2001 From: Allen Short Date: Wed, 21 Mar 2018 20:38:48 +0000 Subject: [PATCH] Properly rollback failed db commits --- redash/handlers/dashboards.py | 5 +++++ redash/handlers/data_sources.py | 2 ++ redash/handlers/users.py | 3 ++- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/redash/handlers/dashboards.py b/redash/handlers/dashboards.py index 869a0f5982..f41cca8bf5 100644 --- a/redash/handlers/dashboards.py +++ b/redash/handlers/dashboards.py @@ -11,6 +11,7 @@ require_permission) from redash.security import csp_allows_embeding from redash.serializers import serialize_dashboard +from sqlalchemy.exc import IntegrityError from sqlalchemy.orm.exc import StaleDataError @@ -199,7 +200,11 @@ def post(self, dashboard_slug): try: models.db.session.commit() except StaleDataError: + models.db.session.rollback() abort(409) + except IntegrityError: + models.db.session.rollback() + abort(400) result = serialize_dashboard(dashboard, with_widgets=True, user=self.current_user) diff --git a/redash/handlers/data_sources.py b/redash/handlers/data_sources.py index 1f4ad17c2b..54e29c5e4f 100644 --- a/redash/handlers/data_sources.py +++ b/redash/handlers/data_sources.py @@ -56,6 +56,7 @@ def post(self, data_source_id): try: models.db.session.commit() except IntegrityError as e: + models.db.session.rollback() if req['name'] in e.message: abort(400, message="Data source with the name {} already exists.".format(req['name'])) @@ -134,6 +135,7 @@ def post(self): models.db.session.commit() except IntegrityError as e: + models.db.session.rollback() if req['name'] in e.message: abort(400, message="Data source with the name {} already exists.".format(req['name'])) diff --git a/redash/handlers/users.py b/redash/handlers/users.py index 0eca25bd01..79e397b97f 100644 --- a/redash/handlers/users.py +++ b/redash/handlers/users.py @@ -138,6 +138,7 @@ def post(self): models.db.session.add(user) models.db.session.commit() except IntegrityError as e: + models.db.session.rollback() if "email" in e.message: abort(400, message='Email already taken.') abort(500) @@ -267,7 +268,7 @@ def post(self, user_id): message = "Email already taken." else: message = "Error updating record" - + models.db.session.rollback() abort(400, message=message) self.record_event({