feat: base 移除基础model层事务

This commit is contained in:
caoqianming 2025-09-16 10:33:44 +08:00
parent 7a82844842
commit f151f4f2ec
1 changed files with 33 additions and 34 deletions

View File

@ -119,16 +119,15 @@ class BaseModel(models.Model):
for attempt in range(3): for attempt in range(3):
try: try:
with transaction.atomic(): # 先尝试获取(带锁)
# 先尝试获取(带锁) try:
try: obj = cls.objects.select_for_update().get(**kwargs)
obj = cls.objects.select_for_update().get(**kwargs) return obj, False
return obj, False except cls.DoesNotExist:
except cls.DoesNotExist: # 不存在则创建
# 不存在则创建 obj = cls(**kwargs, **defaults)
obj = cls(**kwargs, **defaults) obj.save()
obj.save() return obj, True
return obj, True
except IntegrityError: except IntegrityError:
# 发生唯一约束冲突时重试 # 发生唯一约束冲突时重试
if attempt == 2: if attempt == 2:
@ -148,32 +147,32 @@ class BaseModel(models.Model):
if not self.id: if not self.id:
is_create = True is_create = True
self.id = idWorker.get_id() self.id = idWorker.get_id()
with transaction.atomic():
old_parent = None old_parent = None
need_handle_parent = False need_handle_parent = False
if hasattr(self, "parent"): if hasattr(self, "parent"):
if is_create: if is_create:
need_handle_parent = True
else:
try:
old_parent = self.__class__.objects.get(id=self.id).parent
except Exception:
self.parent = None
need_handle_parent = True need_handle_parent = True
else: if self.parent != old_parent:
try: need_handle_parent = True
old_parent = self.__class__.objects.get(id=self.id).parent try:
except Exception: ins = super().save(*args, **kwargs)
self.parent = None except IntegrityError as e:
need_handle_parent = True if is_create:
if self.parent != old_parent: time.sleep(0.01)
need_handle_parent = True self.id = idWorker.get_id()
try:
ins = super().save(*args, **kwargs) ins = super().save(*args, **kwargs)
except IntegrityError as e: raise e
if is_create: # 处理父级
time.sleep(0.01) if need_handle_parent:
self.id = idWorker.get_id() self.handle_parent()
ins = super().save(*args, **kwargs) return ins
raise e
# 处理父级
if need_handle_parent:
self.handle_parent()
return ins
class SoftModel(BaseModel): class SoftModel(BaseModel):