私のDjangoアプリケーションでは、データベースからモデルの単一インスタンスを削除するコードがあります。同時に2つの同時リクエストが同じモデルを同時に削除しようとする可能性があります。この場合、1つのリクエストを成功させ、もう1つのリクエストを失敗させます。これどうやってするの?トランザクションを使用してデータベースからDjangoモデルを安全に削除する
delete()
でインスタンスを削除するとき、Djangoはコマンドが成功したかどうかについての情報を返しません。このコードは、問題を示しています
b0 = Book.objects.get(id=1)
b1 = Book.objects.get(id=1)
b0.delete()
b1.delete()
一つだけこれら二つのdelete()
のコマンドは、実際にオブジェクトを削除したが、私はどちらかわかりません。例外はスローされず、コマンドの成功を示すために何も返されません。純粋なSQLでは、このコマンドは削除された行の数を返します。値が0の場合、削除が失敗したことがわかります。
私はPostgreSQLを既定の読み取りコミットされた分離レベルで使用しています。このレベルの私の理解は、各コマンド(SELECT、DELETEなど)はデータベースのスナップショットを見るが、次のコマンドはデータベースの異なるスナップショットを見ることができるということである。これは私がこのようなことをすることができないことを意味すると信じています:
# I believe this wont work
@commit_on_success
def view(request):
try:
book = Book.objects.get(id=1)
# Possibility that the instance is deleted by the other request
# before we get to the next delete()
book.delete()
except ObjectDoesntExist:
# Already been deleted
アイデアはありますか?