diff options
Diffstat (limited to 'django/db/transaction.py')
| -rw-r--r-- | django/db/transaction.py | 35 |
1 files changed, 33 insertions, 2 deletions
diff --git a/django/db/transaction.py b/django/db/transaction.py index cd27cf6044..55fad9e457 100644 --- a/django/db/transaction.py +++ b/django/db/transaction.py @@ -19,7 +19,7 @@ except ImportError: try: from functools import wraps except ImportError: - from django.utils.functional import wraps # Python 2.3, 2.4 fallback. + from django.utils.functional import wraps # Python 2.3, 2.4 fallback. from django.db import connection from django.conf import settings @@ -30,9 +30,10 @@ class TransactionManagementError(Exception): """ pass -# The state is a dictionary of lists. The key to the dict is the current +# The states are dictionaries of lists. The key to the dict is the current # thread and the list is handled as a stack of values. state = {} +savepoint_state = {} # The dirty flag is set by *_unless_managed functions to denote that the # code under transaction management has changed things to require a @@ -164,6 +165,36 @@ def rollback(): connection._rollback() set_clean() +def savepoint(): + """ + 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. + """ + thread_ident = thread.get_ident() + if thread_ident in savepoint_state: + savepoint_state[thread_ident].append(None) + else: + savepoint_state[thread_ident] = [None] + tid = str(thread_ident).replace('-', '') + sid = "s%s_x%d" % (tid, len(savepoint_state[thread_ident])) + connection._savepoint(sid) + return sid + +def savepoint_rollback(sid): + """ + Rolls back the most recent savepoint (if one exists). Does nothing if + savepoints are not supported. + """ + connection._savepoint_rollback(sid) + +def savepoint_commit(sid): + """ + Commits the most recent savepoint (if one exists). Does nothing if + savepoints are not supported. + """ + connection._savepoint_commit(sid) + ############## # DECORATORS # ############## |
