fix(authbook): 修改创建AuthBook对象锁机制,解决并发操作堵塞问题

This commit is contained in:
Bai 2020-07-14 15:44:56 +08:00 committed by 老广
parent a5df7738f6
commit 1bb366ad94

View File

@ -59,8 +59,12 @@ class AuthBook(BaseUser):
""" """
username = kwargs['username'] username = kwargs['username']
asset = kwargs['asset'] asset = kwargs['asset']
key_lock = 'KEY_LOCK_CREATE_AUTH_BOOK_{}_{}'.format(username, asset.id) lock_key = 'KEY_LOCK_CREATE_AUTH_BOOK_{}_{}'.format(username, asset.id)
with cache.lock(key_lock): lock = cache.lock(lock_key, expire=60)
acquired = lock.acquire(timeout=60)
if acquired:
# 将获取锁的超时时间和锁本身过期时间设置为一致保证并发创建时不会丢失最长等待60s后执行
with transaction.atomic(): with transaction.atomic():
cls.objects.filter( cls.objects.filter(
username=username, asset=asset, is_latest=True username=username, asset=asset, is_latest=True
@ -71,6 +75,8 @@ class AuthBook(BaseUser):
'is_latest': True 'is_latest': True
}) })
obj = cls.objects.create(**kwargs) obj = cls.objects.create(**kwargs)
if lock.locked():
lock.release()
return obj return obj
@property @property