fix(asset_user): 修改创建AuthBook对象锁机制,使用select_for_update替换redis_lock

pull/4318/head
Bai 2020-07-14 18:54:55 +08:00 committed by 老广
parent 1bb366ad94
commit abcb589658
1 changed files with 11 additions and 18 deletions

View File

@ -59,24 +59,17 @@ class AuthBook(BaseUser):
""" """
username = kwargs['username'] username = kwargs['username']
asset = kwargs['asset'] asset = kwargs['asset']
lock_key = 'KEY_LOCK_CREATE_AUTH_BOOK_{}_{}'.format(username, asset.id) with transaction.atomic():
lock = cache.lock(lock_key, expire=60) # 使用select_for_update限制并发创建相同的username、asset数据
cls.objects.select_for_update().filter(
acquired = lock.acquire(timeout=60) username=username, asset=asset, is_latest=True
if acquired: ).update(is_latest=False)
# 将获取锁的超时时间和锁本身过期时间设置为一致保证并发创建时不会丢失最长等待60s后执行 max_version = cls.get_max_version(username, asset)
with transaction.atomic(): kwargs.update({
cls.objects.filter( 'version': max_version + 1,
username=username, asset=asset, is_latest=True 'is_latest': True
).update(is_latest=False) })
max_version = cls.get_max_version(username, asset) obj = cls.objects.create(**kwargs)
kwargs.update({
'version': max_version + 1,
'is_latest': True
})
obj = cls.objects.create(**kwargs)
if lock.locked():
lock.release()
return obj return obj
@property @property