TIL DAY 31 || Django Why transaction.atomic() did not work


When transaction.atomic() works?


ドラムのトランザクションモジュールは、dbの変更時に原子化処理を行う良いモジュールです.しかし、この論理がいつ実行されたかを正確に知ってから書きます.
最初は私が間違っていたので、その関数で実行されているものはすべてロールバックしますか?および.
db変更論理の各関数を興奮してレコーダとする.
しかし、すべての場合はそうすべきではないことを知っています.間違っていなければtransaction rollbackにはならないので、それに気づきました.

Example


次のコードクリップはorderロジックを処理するviewです.

最初は、在庫が数量より少ない場合は、return JsonResponse()でstatus 400を処理し、ロールバックしません.エラーが発生したのではなく、if条件文に乗って間違いなく返しを処理したからです.
そこで、次のコードを変更しました.
上部にExceptionクラスを継承してcustom errorを作成します.

その後returnではなく、次のエラーが発生しました.
if cart.product_option.stock - cart.quantity < 0:
	raise StockDoesNotExist
こうやって取引をする原子()ロジックを実行し、変更したdb事項をロールバックしました.

What I learned ?


また、@transaction.原子レコーダを使用して関数全体にトランザクションを適用する論理を学習し、with文を使用して、ロールバックに必要な部分だけを許可する構造ではなく、より効率的なコードです.