@@ -3,6 +3,7 @@  | 
            ||
| 3 | 3 | 
                from curtail_uuid import CurtailUUID  | 
            
| 4 | 4 | 
                from django.contrib import admin  | 
            
| 5 | 5 | 
                from django.contrib.auth.hashers import make_password  | 
            
| 6 | 
                +from django.db import transaction  | 
            |
| 6 | 7 | 
                 | 
            
| 7 | 8 | 
                from account.models import (LensmanIncomeExpensesInfo, LensmanInfo, LensmanLoginLogInfo, UserIncomeExpensesInfo,  | 
            
| 8 | 9 | 
                UserInfo, UserLoginLogInfo)  | 
            
                @@ -14,10 +15,11 @@ class LensmanInfoAdmin(admin.ModelAdmin):  | 
            ||
| 14 | 15 | 
                     search_fields = ('name', 'phone', 'location')
               | 
            
| 15 | 16 | 
                     list_filter = ('sex', 'user_status', 'status')
               | 
            
| 16 | 17 | 
                 | 
            
| 18 | 
                + @transaction.atomic  | 
            |
| 17 | 19 | 
                def save_model(self, request, obj, form, change):  | 
            
| 18 | 20 | 
                if not obj.lensman_id:  | 
            
| 19 | 21 | 
                try:  | 
            
| 20 | 
                - user_id = UserInfo.objects.get(unionid=obj.unionid).user_id  | 
            |
| 22 | 
                + user_id = UserInfo.objects.select_for_update().get(unionid=obj.unionid).user_id  | 
            |
| 21 | 23 | 
                except UserInfo.DoesNotExist:  | 
            
| 22 | 24 | 
                user_id = None  | 
            
| 23 | 25 | 
                obj.lensman_id = user_id or CurtailUUID.uuid(UserInfo, 'user_id')  | 
            
                @@ -3,6 +3,7 @@  | 
            ||
| 3 | 3 | 
                from curtail_uuid import CurtailUUID  | 
            
| 4 | 4 | 
                from django.contrib.auth.hashers import check_password, make_password  | 
            
| 5 | 5 | 
                from django.contrib.auth.models import Group, User  | 
            
| 6 | 
                +from django.db import transaction  | 
            |
| 6 | 7 | 
                from logit import logit  | 
            
| 7 | 8 | 
                from rest_framework import viewsets  | 
            
| 8 | 9 | 
                from TimeConvert import TimeConvert as tc  | 
            
                @@ -44,6 +45,7 @@ def user_is_registered_api(request):  | 
            ||
| 44 | 45 | 
                 | 
            
| 45 | 46 | 
                 | 
            
| 46 | 47 | 
                @logit  | 
            
| 48 | 
                +@transaction.atomic  | 
            |
| 47 | 49 | 
                def user_signup_api(request):  | 
            
| 48 | 50 | 
                     user_id = request.POST.get('user_id', '')
               | 
            
| 49 | 51 | 
                     username = request.POST.get('username', '')
               | 
            
                @@ -56,7 +58,7 @@ def user_signup_api(request):  | 
            ||
| 56 | 58 | 
                signup_ip, signup_at = ip_addr(request), tc.utc_datetime()  | 
            
| 57 | 59 | 
                 | 
            
| 58 | 60 | 
                try:  | 
            
| 59 | 
                - user = UserInfo.objects.get(user_id=user_id)  | 
            |
| 61 | 
                + user = UserInfo.objects.select_for_update().get(user_id=user_id)  | 
            |
| 60 | 62 | 
                except UserInfo.DoesNotExist:  | 
            
| 61 | 63 | 
                user = None  | 
            
| 62 | 64 | 
                 | 
            
                @@ -83,12 +85,13 @@ def user_signup_api(request):  | 
            ||
| 83 | 85 | 
                 | 
            
| 84 | 86 | 
                 | 
            
| 85 | 87 | 
                @logit  | 
            
| 88 | 
                +@transaction.atomic  | 
            |
| 86 | 89 | 
                def user_login_api(request):  | 
            
| 87 | 90 | 
                     username = request.POST.get('username', '')
               | 
            
| 88 | 91 | 
                     password = request.POST.get('password', '')
               | 
            
| 89 | 92 | 
                 | 
            
| 90 | 93 | 
                try:  | 
            
| 91 | 
                - user = UserInfo.objects.get(username=username)  | 
            |
| 94 | 
                + user = UserInfo.objects.select_for_update().get(username=username)  | 
            |
| 92 | 95 | 
                except UserInfo.DoesNotExist:  | 
            
| 93 | 96 | 
                return response(UserStatusCode.USER_NOT_FOUND)  | 
            
| 94 | 97 | 
                 | 
            
                @@ -116,6 +119,7 @@ def user_login_api(request):  | 
            ||
| 116 | 119 | 
                 | 
            
| 117 | 120 | 
                 | 
            
| 118 | 121 | 
                @logit  | 
            
| 122 | 
                +@transaction.atomic  | 
            |
| 119 | 123 | 
                def user_wx_authorize_api(request):  | 
            
| 120 | 124 | 
                     user_id = request.POST.get('user_id', '')
               | 
            
| 121 | 125 | 
                 | 
            
                @@ -131,7 +135,7 @@ def user_wx_authorize_api(request):  | 
            ||
| 131 | 135 | 
                 | 
            
| 132 | 136 | 
                # 判断 unionid 是否已经存在,如果已经存在,则直接返回改帐户信息  | 
            
| 133 | 137 | 
                try:  | 
            
| 134 | 
                - user = UserInfo.objects.get(unionid=unionid)  | 
            |
| 138 | 
                + user = UserInfo.objects.select_for_update().get(unionid=unionid)  | 
            |
| 135 | 139 | 
                except UserInfo.DoesNotExist:  | 
            
| 136 | 140 | 
                user = None  | 
            
| 137 | 141 | 
                 | 
            
                @@ -153,7 +157,7 @@ def user_wx_authorize_api(request):  | 
            ||
| 153 | 157 | 
                signup_ip, signup_at = ip_addr(request), tc.utc_datetime()  | 
            
| 154 | 158 | 
                 | 
            
| 155 | 159 | 
                try:  | 
            
| 156 | 
                - user = UserInfo.objects.get(user_id=user_id)  | 
            |
| 160 | 
                + user = UserInfo.objects.select_for_update().get(user_id=user_id)  | 
            |
| 157 | 161 | 
                except UserInfo.DoesNotExist:  | 
            
| 158 | 162 | 
                user = None  | 
            
| 159 | 163 | 
                 | 
            
                @@ -216,6 +220,7 @@ def guest_status_api(request):  | 
            ||
| 216 | 220 | 
                 | 
            
| 217 | 221 | 
                 | 
            
| 218 | 222 | 
                @logit  | 
            
| 223 | 
                +@transaction.atomic  | 
            |
| 219 | 224 | 
                def guest_login_api(request):  | 
            
| 220 | 225 | 
                """ 游客登录 """  | 
            
| 221 | 226 | 
                gen = get_guest_entrance_control()  | 
            
                @@ -249,12 +254,12 @@ def guest_login_api(request):  | 
            ||
| 249 | 254 | 
                }  | 
            
| 250 | 255 | 
                # 若 uuid 存在,则 get_or_create,否则 create  | 
            
| 251 | 256 | 
                if uuid:  | 
            
| 252 | 
                - user, created = UserInfo.objects.get_or_create(user_from=UserInfo.GUEST_USER, uuid=uuid, defaults=fields)  | 
            |
| 257 | 
                + user, created = UserInfo.objects.select_for_update().get_or_create(user_from=UserInfo.GUEST_USER, uuid=uuid, defaults=fields)  | 
            |
| 253 | 258 | 
                if created:  | 
            
| 254 | 259 | 
                             user.nickname = u'游客{}'.format(user.pk)
               | 
            
| 255 | 260 | 
                user.save()  | 
            
| 256 | 261 | 
                else:  | 
            
| 257 | 
                - user = UserInfo.objects.create(**fields)  | 
            |
| 262 | 
                + user = UserInfo.objects.select_for_update().create(**fields)  | 
            |
| 258 | 263 | 
                         user.nickname = u'游客{}'.format(user.pk)
               | 
            
| 259 | 264 | 
                user.save()  | 
            
| 260 | 265 | 
                 | 
            
                @@ -300,7 +300,7 @@ def lensman_origin_photo_upload_api(request):  | 
            ||
| 300 | 300 | 
                     photo = request.FILES.get('photo', '')
               | 
            
| 301 | 301 | 
                 | 
            
| 302 | 302 | 
                try:  | 
            
| 303 | 
                - order = OrderInfo.objects.get(order_id=order_id, pay_status=OrderInfo.PAID)  | 
            |
| 303 | 
                + order = OrderInfo.objects.select_for_update().get(order_id=order_id, pay_status=OrderInfo.PAID)  | 
            |
| 304 | 304 | 
                except OrderInfo.DoesNotExist:  | 
            
| 305 | 305 | 
                return response(OrderStatusCode.WX_ORDER_NOT_FOUND)  | 
            
| 306 | 306 | 
                 | 
            
                @@ -375,7 +375,7 @@ def lensman_origin_photo_upload_api(request):  | 
            ||
| 375 | 375 | 
                r_photo_path=r_photo_path  | 
            
| 376 | 376 | 
                )  | 
            
| 377 | 377 | 
                 | 
            
| 378 | 
                - porder, created = GroupPhotoOrderInfo.objects.get_or_create(  | 
            |
| 378 | 
                + porder, created = GroupPhotoOrderInfo.objects.select_for_update().get_or_create(  | 
            |
| 379 | 379 | 
                group_id=order.group_id,  | 
            
| 380 | 380 | 
                session_id=session_id,  | 
            
| 381 | 381 | 
                user_id=order.from_uid,  | 
            
                @@ -116,7 +116,7 @@ def order_paid_success(order):  | 
            ||
| 116 | 116 | 
                order.paid_at = tc.utc_datetime()  | 
            
| 117 | 117 | 
                order.save()  | 
            
| 118 | 118 | 
                 | 
            
| 119 | 
                - porder, created = GroupPhotoOrderInfo.objects.get_or_create(  | 
            |
| 119 | 
                + porder, created = GroupPhotoOrderInfo.objects.select_for_update().get_or_create(  | 
            |
| 120 | 120 | 
                group_id=order.group_id,  | 
            
| 121 | 121 | 
                session_id=order.session_id,  | 
            
| 122 | 122 | 
                user_id=order.from_uid,  | 
            
                @@ -185,7 +185,7 @@ def wx_order_query_api(request):  | 
            ||
| 185 | 185 | 
                     transaction_id = request.POST.get('transaction_id', '')
               | 
            
| 186 | 186 | 
                 | 
            
| 187 | 187 | 
                try:  | 
            
| 188 | 
                - order = OrderInfo.objects.get(order_id=order_id)  | 
            |
| 188 | 
                + order = OrderInfo.objects.select_for_update().get(order_id=order_id)  | 
            |
| 189 | 189 | 
                except OrderInfo.DoesNotExist:  | 
            
| 190 | 190 | 
                return response(OrderStatusCode.WX_ORDER_NOT_FOUND)  | 
            
| 191 | 191 | 
                 |