Django的鎖和事務
鎖
select_for_update(nowait=False, skip_locked=False)mysql
返回一個鎖住行直到事務結束的查詢集,若是數據庫支持,它將生成一個 SELECT ... FOR UPDATE 語句。sql
舉個例子:數據庫
entries = Entry.objects.select_for_update().filter(author=request.user)
全部匹配的行將被鎖定,直到事務結束。這意味着能夠經過鎖防止數據被其它事務修改。django
通常狀況下若是其餘事務鎖定了相關行,那麼本查詢將被阻塞,直到鎖被釋放。 若是這不想要使查詢阻塞的話,使用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參數。oracle
使用不支持這些選項的數據庫後端(如MySQL)將nowait=True或skip_locked=True轉換爲select_for_update()將致使拋出DatabaseError異常,這能夠防止代碼意外終止。app
事務
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))