正如这里所报道的,这似乎是与 DBMS 相关的事情,与避免无间隙序列的并发和性能有关。
所以我已经使用一个辅助模型“Progressive”解决了这个问题,它持有、锁定和递增一行。
# models.py
from django.db import models, transaction
class Counter(models.Model):
name = models.CharField(max_length=40, unique=True, db_index=True)
n = models.PositiveIntegerField(default=1)
class Customer(models.Model):
def save(self, *args, **kwargs):
super(Customer, self).save(*args, **kwargs)
if self.cod == '':
with transaction.commit_on_success():
try:
counter = Counter.objects.select_for_update().get(name='Customer')
except Counter.DoesNotExist:
counter = Counter.objects.select_for_update().create(name='Customer')
self.cod = "CUST%d" % counter.n
counter.n += 1
counter.save()
super(Customer, self).save(*args, **kwargs)
请注意,这select_for_update()
是锁定行的原因(但请注意使用的 DBMS),直到事务没有终止。
希望这可以帮助