Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Refactored implementation of savepoints.

Prepared for using savepoints within transactions in autocommit mode.
  • Loading branch information...
commit e264f67174622f66503e4748e2f71c72a4a5064b 1 parent 918f44e
@aaugustin aaugustin authored
Showing with 24 additions and 19 deletions.
  1. +24 −19 django/db/backends/__init__.py
View
43 django/db/backends/__init__.py
@@ -176,54 +176,59 @@ def close(self):
##### Backend-specific savepoint management methods #####
def _savepoint(self, sid):
- if not self.features.uses_savepoints or self.autocommit:
- return
self.cursor().execute(self.ops.savepoint_create_sql(sid))
def _savepoint_rollback(self, sid):
- if not self.features.uses_savepoints or self.autocommit:
- return
self.cursor().execute(self.ops.savepoint_rollback_sql(sid))
def _savepoint_commit(self, sid):
- if not self.features.uses_savepoints or self.autocommit:
- return
self.cursor().execute(self.ops.savepoint_commit_sql(sid))
+ def _savepoint_allowed(self):
+ # Savepoints cannot be created outside a transaction
+ return self.features.uses_savepoints and not self.autocommit
+
##### Generic savepoint management methods #####
def savepoint(self):
"""
- Creates a savepoint (if supported and required by the backend) inside the
- current transaction. Returns an identifier for the savepoint that will be
- used for the subsequent rollback or commit.
+ Creates a savepoint inside the current transaction. Returns an
+ identifier for the savepoint that will be used for the subsequent
+ rollback or commit. Does nothing if savepoints are not supported.
"""
+ if not self._savepoint_allowed():
+ return
+
thread_ident = thread.get_ident()
+ tid = str(thread_ident).replace('-', '')
self.savepoint_state += 1
-
- tid = str(thread_ident).replace('-', '')
sid = "s%s_x%d" % (tid, self.savepoint_state)
+
+ self.validate_thread_sharing()
self._savepoint(sid)
+
return sid
def savepoint_rollback(self, sid):
"""
- Rolls back the most recent savepoint (if one exists). Does nothing if
- savepoints are not supported.
+ Rolls back to a savepoint. Does nothing if savepoints are not supported.
"""
+ if not self._savepoint_allowed():
+ return
+
self.validate_thread_sharing()
- if self.savepoint_state:
- self._savepoint_rollback(sid)
+ self._savepoint_rollback(sid)
def savepoint_commit(self, sid):
"""
- Commits the most recent savepoint (if one exists). Does nothing if
- savepoints are not supported.
+ Releases a savepoint. Does nothing if savepoints are not supported.
"""
+ if not self._savepoint_allowed():
+ return
+
self.validate_thread_sharing()
- if self.savepoint_state:
- self._savepoint_commit(sid)
+ self._savepoint_commit(sid)
def clean_savepoints(self):
"""
Please sign in to comment.
Something went wrong with that request. Please try again.