mirror of https://github.com/jumpserver/jumpserver
fix(asset_user): 修改创建AuthBook对象锁机制,使用select_for_update替换redis_lock
parent
1bb366ad94
commit
abcb589658
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue