2013-09-21 45 views
1

我有一个主键是数字的表不是顺序的。 公司的政策是注册可用ID值较低的新行。 I.E.在插入之前锁定ID - Oracle 10G

table.ID = [11,13,14,16,17] 
min(table.ID) = 12 

我有一个算法,给我最低的可用。我想知道如何在插入前防止此ID被其他人使用。

数据库能做到吗?或者它会是编程语言?

谢谢。

+0

我不知道“BD”在这里应该代表什么。除了软件之外,它将如何完成?你在寻找一个硬件解决方案? –

回答

1

公司政策极其短视。除非公司的目标是构建不扩展的应用程序,并且公司对性能毫不关心。

如果你真的想这样做,你需要序列化所有与这个表相关的事务 - 本质上将你的功能强大的服务器变成一个单线程的单用户低端机器。有许多方法可以做到这一点。最简单的(虽然不是简单的)方法是在行的SELECT ... FOR UPDATE的最大关键字小于您要插入的新关键字(在这种情况下为11)。一旦你获得锁定,你需要重新确认12是空的。如果是的话,你可以用id来插入12行。否则,你需要重新启动进程来寻找新的密钥,并试图用一个小于该密钥的id来锁定该行。当你的事务提交时,锁将被释放,并且下一个被阻塞的等待锁的会话将能够处理。这假定您可以控制每个尝试向该表中插入数据的进程,并且它们都将实现完全相同的逻辑。如果您允许交易跨越等待人类输入,它将锁定系统,因为人类将不可避免地与行锁定一起吃午餐。所有这些序列化都会大大降低应用程序的可伸缩性。

我强烈地鼓励你推动反对荒谬的“要求”,而不是实施这个可怕的事情。