发布于 2021-06-04 07:14:45
在这里回答我自己的问题,因为我从Github上的一个维护人员那里得到了答案。
Redis本身并不保证这一点,但是我们当前用于任务的库(RQ)在一定程度上保证了操作的顺序,因为每个工作人员一次只能处理一个作业。对于大多数情况下(包括自定义字段),这并不重要,因为所有数据库写入都发生在事务中,使得同时更新同一个对象的竞争条件几乎不可能实现。IP地址对象的并发写锁是不同的。这是因为Nautobot内部的特性允许从网络前缀同时请求空闲地址空间(例如,“在192.168.0.0/24.给我下10个可用的in .”),并立即分配请求返回的任意数量的免费地址(例如“.并分配它们”)。为此,查询返回的IP列表将立即写入数据库,创建新的IPAddress对象,从而从空闲池中删除它们。IPAddress对象没有唯一性约束,因此如果没有这个显式的写锁,两个调用方就可以从同一个块请求IP,接收相同的空闲地址,并尝试分配重复的地址。这违反了最少惊讶的原则,而不是数据模型,因此这里的Redis写锁是保持第一个接收锁的调用方是分配IP的调用方的合理期望的关键,而下面的调用方要么收到正确的列表,要么由于地址不再空闲而无法分配地址。我希望这能回答你的问题!
https://serverfault.com/questions/1065441
复制相似问题