我们的应用需要在LDAP后端中同步他的数据。 例如:每次在django中保存的用户必须将某些数据保存在LDAP中。 为此,我们使用django ldap后端,它工作得很好。 开始时,我们在成员的post_save信号中写了同步代码。同步工作很好,但这样,如果LDAP由于任何原因失败,我们无法回滚数据库保存。 所以我们在overridded save方法中写入同步代码。但是在这里我们也找不到回滚的方法。 我们最接近的解决方案是:
@transaction.commit_manually
def save(self, *args, **kwargs):
super(MyModel, self).save(*args, **kwargs)
try:
self.sync_with_ldap()
except:
transaction.rollback()
raise
else:
transaction.commit()
此代码返回一个TransactionManagementError:“当'原子'块处于活动状态时,这是禁止的。”
我们该如何做到:
答案 0 :(得分:0)
事实上,很简单:
只需用@ transaction.atomic
进行装饰@transaction.atomic
def save(self, *args, **kwargs):
super(MyModel, self).save(*args, **kwargs)
try:
self.sync_to_ldap()
except:
raise