应用名/views.py(视图,悲观锁,select_for_update):
from django.shortcuts import render
from django.http import HttpResponse
from django.views.generic import View
from django.db import transaction
from 应用名.models import 模型类名
# 类视图 (并发,悲观锁)
class MyView(View):
@transaction.atomic
def post(self, request):
# select * from 表名 where id=1 for update;
# for update 就表示锁,只有获取到锁才会执行查询,否则阻塞等待。
obj = 模型类名.objects.select_for_update().get(id=1)
# 等事务提交后,会自动释放锁。
return HttpResponse('ok')
乐观锁其实并不是锁。通过SQL的where子句中的条件是否满足来判断是否满足更新条件来更新数据库,通过受影响行数判断是否更新成功,如果更新失败可以再次进行尝试,如果多次尝试失败就返回更新失败的结果。
使用乐观锁时,必须设置数据库的隔离级别是Read Committed(可以读到其他线程已提交的数据)。如果隔离级别是Repeatable Read(可重复读,读到的数据都是开启事务时刻的数据,即使其他线程