Django的锁和事务

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))
相关文章
相关标签/搜索