I have three database and I want to adding data to they in transactions on one request.
For example my code.
@transaction.commit_manually
def my_view(request):
try:
MyModel_one(...).save(using='default')
MyModel_two(...).save(using='db_one')
MyModel_three(...).save(using='db_two') # <-- for example we make exception here (duplicate data)
except IntegrityError:
transaction.rollback()
transaction.rollback(using='db_one')
transaction.rollback(using='db_two')
return ...
transaction.commit()
transaction.commit(using='db_one')
transaction.commit(using='db_two')
return ...
Result:
question: Why transaction didn't work here ? What can I do to get work transaction ?
(I try to use other ways but didn't have success result) (Also I understand it's not beutiful code but very simple for understanding the problem)
Django 1.7.7 Python 2.7
Database: default — postgres db_one — mysql db_two — mysql
The transaction.commit_manually decorator was deprecated in Django 1.6. You should switch to Django's new transaction management.
I don't think you need to commit transactions manually, you can nest transaction.atomic.
def my_view(request):
try:
with transaction.atomic(using='default'):
with transaction.atomic(using='db_one'):
with transaction.atomic(using='db_two'):
MyModel_one(...).save(using='default')
MyModel_two(...).save(using='db_one')
MyModel_three(...).save(using='db_two') # raises exception
except IntegrityError:
return ...
return ...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With