天天看點

Django的鎖和事務Django的鎖和事務

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