私は単純なライブラリアプリケーションを持っています。Djangoでの制御のアトミックトランザクション
settings.py
で:
AUTOCOMMIT=False
from django.db import IntegrityError, transaction
class CreateLoan(forms.Form):
#Fields...
def save(self):
id_book = form.cleaned_data.get('id_book', None)
id_customer = form.cleaned_data.get('id_customer', None)
start_date = form.cleaned_data.get('start_date', None)
book = Book.objects.get(id=id_book)
customer = Customer.objects.get(id=id_customer)
new_return = Return(
book=book
start_date=start_date)
txn=Loan_Txn(
customer=customer,
book=book,
start_date=start_date
)
try
with transaction.atomic():
book.update(status="ON_LOAN")
new_return.save(force_insert=True)
txn.save(force_insert=True)
except IntegrityError:
raise forms.ValidationError("Something occured. Please try again")
forms.py
で1つのアクションとしてコミット、およびアクションのいずれかが失敗した場合にロールバックする3つのアクションを強制するために、私は次のコードの変更を行いました
私はまだこれについて何かが不足していますか?私はPython 3.4.3でDjango 1.9を使用しています。データベースはMySQLです。
なぜあなたは 'AUTOCOMMIT = False'を設定していますか?それをしないでください。さもなければ、あなたは正しい考えを持っています。 –
@KevinChristopherHenryがループを閉じるために、なぜ 'AUTOCOMMIT = False'がクエリに役立たないのか質問できますか?デフォルトでは 'AUTOCOMMIT = True'、' atomic'ブロックでラップされていないすべてのトランザクションについては、実行しコミットするだけですか? – bryansis2010
そうです、私の答えを見てください。 –