Django ORM小记

对一些常用的小技巧记录。

select_for_update

select_for_update 可以做小并发的控制,其只能在事务中使用。符合条件的查询结果会被加锁,其他查询包含加锁的数据时会阻塞,直到事务完成,如果其他查询结果不包含加锁的记录则不受影响。

1
2
3
4
5
6
7
from django.db import transaction

with transaction.atomic():
# 会给所有type = '1' 的记录加锁
tickets = Ticket.objects.select_for_update().filter(type='1')
# 单条记录加锁
ticket = Ticket.objects.select_for_update().get(id=12)