Add a custom context manager for rollbacks (#282)

This commit is contained in:
Raphael Michel
2016-10-21 10:40:04 +02:00
committed by GitHub
parent 5923af37f3
commit 0dece9e62b
3 changed files with 69 additions and 53 deletions

View File

@@ -0,0 +1,28 @@
import contextlib
from django.db import transaction
class DummyRollbackException(Exception):
pass
@contextlib.contextmanager
def rolledback_transaction():
"""
This context manager runs your code in a database transaction that will be rolled back in the end.
This can come in handy to simulate the effects of a database operation that you do not actually
want to perform.
Note that rollbacks are a very slow operation on most database backends. Also, long-running
transactions can slow down other operations currently running and you should not use this
in a place that is called frequently.
"""
try:
with transaction.atomic():
yield
raise DummyRollbackException()
except DummyRollbackException:
pass
else:
raise Exception('Invalid state, should have rolled back.')