Refactored implementation of savepoints.
Prepared for using savepoints within transactions in autocommit mode.
This commit is contained in:
parent
918f44e3ae
commit
e264f67174
|
@ -176,53 +176,58 @@ class BaseDatabaseWrapper(object):
|
||||||
##### Backend-specific savepoint management methods #####
|
##### Backend-specific savepoint management methods #####
|
||||||
|
|
||||||
def _savepoint(self, sid):
|
def _savepoint(self, sid):
|
||||||
if not self.features.uses_savepoints or self.autocommit:
|
|
||||||
return
|
|
||||||
self.cursor().execute(self.ops.savepoint_create_sql(sid))
|
self.cursor().execute(self.ops.savepoint_create_sql(sid))
|
||||||
|
|
||||||
def _savepoint_rollback(self, 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))
|
self.cursor().execute(self.ops.savepoint_rollback_sql(sid))
|
||||||
|
|
||||||
def _savepoint_commit(self, 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))
|
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 #####
|
##### Generic savepoint management methods #####
|
||||||
|
|
||||||
def savepoint(self):
|
def savepoint(self):
|
||||||
"""
|
"""
|
||||||
Creates a savepoint (if supported and required by the backend) inside the
|
Creates a savepoint inside the current transaction. Returns an
|
||||||
current transaction. Returns an identifier for the savepoint that will be
|
identifier for the savepoint that will be used for the subsequent
|
||||||
used for the subsequent rollback or commit.
|
rollback or commit. Does nothing if savepoints are not supported.
|
||||||
"""
|
"""
|
||||||
|
if not self._savepoint_allowed():
|
||||||
|
return
|
||||||
|
|
||||||
thread_ident = thread.get_ident()
|
thread_ident = thread.get_ident()
|
||||||
|
tid = str(thread_ident).replace('-', '')
|
||||||
|
|
||||||
self.savepoint_state += 1
|
self.savepoint_state += 1
|
||||||
|
|
||||||
tid = str(thread_ident).replace('-', '')
|
|
||||||
sid = "s%s_x%d" % (tid, self.savepoint_state)
|
sid = "s%s_x%d" % (tid, self.savepoint_state)
|
||||||
|
|
||||||
|
self.validate_thread_sharing()
|
||||||
self._savepoint(sid)
|
self._savepoint(sid)
|
||||||
|
|
||||||
return sid
|
return sid
|
||||||
|
|
||||||
def savepoint_rollback(self, sid):
|
def savepoint_rollback(self, sid):
|
||||||
"""
|
"""
|
||||||
Rolls back the most recent savepoint (if one exists). Does nothing if
|
Rolls back to a savepoint. Does nothing if savepoints are not supported.
|
||||||
savepoints are not supported.
|
|
||||||
"""
|
"""
|
||||||
|
if not self._savepoint_allowed():
|
||||||
|
return
|
||||||
|
|
||||||
self.validate_thread_sharing()
|
self.validate_thread_sharing()
|
||||||
if self.savepoint_state:
|
|
||||||
self._savepoint_rollback(sid)
|
self._savepoint_rollback(sid)
|
||||||
|
|
||||||
def savepoint_commit(self, sid):
|
def savepoint_commit(self, sid):
|
||||||
"""
|
"""
|
||||||
Commits the most recent savepoint (if one exists). Does nothing if
|
Releases a savepoint. Does nothing if savepoints are not supported.
|
||||||
savepoints are not supported.
|
|
||||||
"""
|
"""
|
||||||
|
if not self._savepoint_allowed():
|
||||||
|
return
|
||||||
|
|
||||||
self.validate_thread_sharing()
|
self.validate_thread_sharing()
|
||||||
if self.savepoint_state:
|
|
||||||
self._savepoint_commit(sid)
|
self._savepoint_commit(sid)
|
||||||
|
|
||||||
def clean_savepoints(self):
|
def clean_savepoints(self):
|
||||||
|
|
Loading…
Reference in New Issue