我有一个表,其主键是数字不是顺序的。根据公司政策,注册新行的 ID 值较低。IE
table.ID = [11,13,14,16,17]
min(table.ID) = 12
我有一个算法可以给我最低的可用值。我想知道如何在插入之前防止此 ID 被其他人使用。
DB可以做到吗?还是编程语言?
谢谢。
公司政策极其短视。除非公司的目标是构建不可扩展的应用程序并且公司不关心性能。
如果你真的想这样做,你需要序列化你所有触及这个表的事务——本质上把你漂亮的、强大的服务器变成一个单线程的单用户低端机器。有很多方法可以做到这一点。最简单(虽然不简单)的方法是SELECT ... FOR UPDATE
在最大键小于您要插入的新键(在本例中为 11)的行上执行 a。获得锁后,您需要重新确认 12 是空的。如果是,您可以插入id
12 的行。否则,您需要重新启动进程以查找新密钥并尝试使用id
比那个键少一个。当您的事务提交时,锁将被释放,并且被阻塞等待锁的下一个会话将能够处理。这假设您可以控制尝试将数据插入此表的每个进程,并且它们都将实现完全相同的逻辑。如果您允许事务跨越等待人工输入,它将锁定系统,因为人类将不可避免地在锁定行的情况下去吃午饭。所有这些序列化都会从根本上降低应用程序的可伸缩性。
我强烈鼓励您反对荒谬的“要求”,而不是实施这种可怕的事情。