feat: base 添加locked_get_or_create

This commit is contained in:
caoqianming 2026-01-09 16:53:57 +08:00
parent 216e82dae7
commit 78a781290d
1 changed files with 26 additions and 1 deletions

View File

@ -151,6 +151,31 @@ class BaseModel(models.Model):
time.sleep(0.1 * (attempt + 1))
@classmethod
def locked_get_or_create(cls, defaults: dict, **kwargs):
"""
仅用于事务内
并发安全的 get_or_create
"""
if not connection.in_atomic_block:
raise RuntimeError("locked_get_or_create 必须在事务中调用")
defaults = defaults or {}
qs = cls.objects.select_for_update().filter(**kwargs)
cnt = qs.count()
if cnt > 1:
raise RuntimeError(
f"{cls.__name__} 数据异常:定位条件 {kwargs} 命中 {cnt}"
)
if cnt == 1:
return qs.get(), False
obj = cls.objects.create(**kwargs, **defaults)
return obj, True
def handle_parent(self):
pass