Django的鎖和事務
鎖
select_for_update(nowait=False, skip_locked=False)
傳回一個鎖住行直到事務結束的查詢集,如果資料庫支援,它将生成一個 SELECT ... FOR UPDATE 語句。
舉個例子:
entries = Entry.objects.select_for_update().filter(author=request.user)
所有比對的行将被鎖定,直到事務結束。這意味着可以通過鎖防止資料被其它事務修改。
一般情況下如果其他事務鎖定了相關行,那麼本查詢将被阻塞,直到鎖被釋放。 如果這不想要使查詢阻塞的話,使用select_for_update(nowait=True)。 如果其它事務持有沖突的鎖, 那麼查詢将引發 DatabaseError 異常。你也可以使用select_for_update(skip_locked=True)忽略鎖定的行。 nowait和skip_locked是互斥的,同時設定會導緻ValueError。
目前,postgresql,oracle和mysql資料庫後端支援select_for_update()。 但是,MySQL不支援nowait和skip_locked參數。
使用不支援這些選項的資料庫後端(如MySQL)将nowait=True或skip_locked=True轉換為select_for_update()将導緻抛出DatabaseError異常,這可以防止代碼意外終止。
事務
import os
if __name__ == '__main__':
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "BMS.settings")
import django
django.setup()
import datetime
from app01 import models
try:
from django.db import transaction
with transaction.atomic():
new_publisher = models.Publisher.objects.create(name="火星出版社")
models.Book.objects.create(title="橘子物語", publish_date=datetime.date.today(), publisher_id=10) # 指定一個不存在的出版社id
except Exception as e:
print(str(e))
轉載于:https://www.cnblogs.com/xiao-xue-di/p/10269351.html