From 1bb366ad944c7e44529131f25d4aa1cab2d841f9 Mon Sep 17 00:00:00 2001 From: Bai Date: Tue, 14 Jul 2020 15:44:56 +0800 Subject: [PATCH] =?UTF-8?q?fix(authbook):=20=E4=BF=AE=E6=94=B9=E5=88=9B?= =?UTF-8?q?=E5=BB=BAAuthBook=E5=AF=B9=E8=B1=A1=E9=94=81=E6=9C=BA=E5=88=B6?= =?UTF-8?q?=EF=BC=8C=E8=A7=A3=E5=86=B3=E5=B9=B6=E5=8F=91=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E5=A0=B5=E5=A1=9E=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/models/authbook.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/apps/assets/models/authbook.py b/apps/assets/models/authbook.py index 052b83a64..b5882eb45 100644 --- a/apps/assets/models/authbook.py +++ b/apps/assets/models/authbook.py @@ -59,8 +59,12 @@ class AuthBook(BaseUser): """ username = kwargs['username'] asset = kwargs['asset'] - key_lock = 'KEY_LOCK_CREATE_AUTH_BOOK_{}_{}'.format(username, asset.id) - with cache.lock(key_lock): + lock_key = 'KEY_LOCK_CREATE_AUTH_BOOK_{}_{}'.format(username, asset.id) + lock = cache.lock(lock_key, expire=60) + + acquired = lock.acquire(timeout=60) + if acquired: + # 将获取锁的超时时间和锁本身过期时间设置为一致,保证并发创建时不会丢失,最长等待60s后执行 with transaction.atomic(): cls.objects.filter( username=username, asset=asset, is_latest=True @@ -71,7 +75,9 @@ class AuthBook(BaseUser): 'is_latest': True }) obj = cls.objects.create(**kwargs) - return obj + if lock.locked(): + lock.release() + return obj @property def connectivity(self):