七.5 公户变私户+事务及行级锁

我现在有一个问题:公户变私户的问题:

公户是所有销售都能看到,但此时多个销售有可能同时去申请某个客户成自己的私户这就有问题了--应该谁先申请是谁的!!

如下图中:这是[email protected]用户登录(yh1234)的结果页面,--- 我再用火狐浏览器用[email protected]用户登录(root1234)打开另一页面。

问题就来了,我用yh用户把华和庆客户选中并点放入私户---暂不点提交,我在root用户的公户页面也同时把这两个客户选中并放入私户--暂不点提交。

此时我用yh用户点提交,可以看到华和庆客户已变成自己的私户了,但是我到root用户页面一点提交后发现华和庆又变成root自己的私户了。---yh用户那不存在了!!

七.5 公户变私户+事务及行级锁_第1张图片

我此前的views.py中的代码如下:

 def multi_apply(self):  # action的方法
        # 公户变私户方法
        ids = self.request.POST.getlist('id')  # 拿到客户Id
        # models.Customer.objects.filter(id__in=ids)这个拿到的就是你当前的传过来的多个客户,前面加*号是把它打散
        # self.request.user.customers拿到的是models.py中的一对多的管理对象
        self.request.user.customers.add(*models.Customer.objects.filter(id__in=ids))#把用户与客户id进行绑定

如果两人同时去修改的话会出问题,所以要加锁---行级锁(跟事务一起配合起来用)--保证数据完整性和一致性。

打开两cdm都登录mysql数据库如下实验:(只有A用户commint提交后才能释放)

mysql数据中加行级锁
  开始事务:begin;
  加锁 for update : select * from student where id=1 for update;
  结束事务:commit;

七.5 公户变私户+事务及行级锁_第2张图片

 

 

 (1)views.py中加锁:--就可解决上述问题了---手速快的人抢到

from django.db import transaction#导入事务
import time
from django.conf import settings
    def multi_apply(self):
        # 公户变私户
        ids = self.request.POST.getlist('id')
        apply_num = len(ids)#你申请的客户数量
     
        with transaction.atomic():#原子性
            # 事务:
            # select_for_update 加锁  consultant__isnull是设置你可更改的数量--那别人就抢不走你的这几个
            obj_list = models.Customer.objects.filter(id__in=ids, consultant__isnull=True).select_for_update()
            if apply_num == len(obj_list):#如果你申请的客户数等于你可修改的客户数量说明你是最快来的
                # time.sleep(5) #obj_list.update是修改
                obj_list.update(consultant=self.request.user)
            else:
                return HttpResponse('你手速太慢了,已经被别人抢走了')

 2.添加私户不超过上限

设置客户的总量--那得做一个配置(不要在views.py中写死)

 (1)settings.py中:

CUSTOMER_MAX_NUM = 150#你最多申请150个

(2)views.py中用这个数:

from django.conf import settings
    def multi_apply(self):
        # 公户变私户
        ids = self.request.POST.getlist('id')
        apply_num = len(ids)#你申请的客户数量
        # 用户总数不能超过设置值
        if self.request.user.customers.count() + apply_num > settings.CUSTOMER_MAX_NUM:
            return HttpResponse('做人不要太贪心,给别人的机会')
        # 用户总数不能超过设置值
        with transaction.atomic():#原子性
            # 事务:
            # select_for_update 加锁  consultant__isnull是设置你可更改的数量--那别人就抢不走你的这几个
            obj_list = models.Customer.objects.filter(id__in=ids, consultant__isnull=True).select_for_update()
            if apply_num == len(obj_list):#如果你申请的客户数等于你可修改的客户数量说明你是最快来的
                # time.sleep(5) #obj_list.update是修改
                obj_list.update(consultant=self.request.user)
            else:
                return HttpResponse('你手速太慢了,已经被别人抢走了')

(3)customer_list.html中:且做判断如果是在公户中则不显示放入公户标签,如果是在私户中则不显示放入私户标签

效果如下:

七.5 公户变私户+事务及行级锁_第3张图片

 七.5 公户变私户+事务及行级锁_第4张图片

 

 代码:

{% extends 'layout.html' %}

{% block css %}

{% endblock %}

{% block content %}


Panel heading



添加
{# {{ add_btn }}#}







{% csrf_token %}








{# #}


{# #}
{# #}



{# #}



{% if request.path_info == '/crm/my_customer/' %}


{% endif %}






{% for customer in all_customer %}




{# #}


{# #}
{# #}



{# #}



{% if request.path_info == '/crm/my_customer/' %}

{# #}

{% endif %}



{% endfor %}



选择 序号 QQQQ昵称 姓名 性别手机号客户来源 咨询课程 班级类型 状态咨询日期 最后跟进日期 销售 已报班级 跟进记录 报名记录 操作
{{ forloop.counter }} {{ customer.qq }}{{ customer.qq_name|default:'暂无' }} {{ customer.name|default:'暂无' }} {{ customer.get_sex_display }}{{ customer.phone|default:'暂无' }}{{ customer.get_source_display }} {{ customer.course }} {{ customer.get_class_type_display }}
{{ customer.show_status }}

{{ customer.date }} {{ customer.last_consult_date }} {{ customer.consultant }} {{ customer.show_classes }} 查看跟进添加报名表 {{ customer.enroll_link }} class="fa fa-edit fa-fw">










{% endblock %}

你可能感兴趣的:(七.5 公户变私户+事务及行级锁)