我有表EMPLOYEE(idEmp,Name,lastName,Adress),我希望以每次有人插入新员工的方式阻止此表,这个新ID必须连续到最后一个员工的ID ...
- >实际上,可能有几个人试图在同一时间插入新员工,这就是为什么我需要锁定表...这些是替代方案:
在行共享模式下锁定表EMPLOYEE.
锁定表EMPLOYEE在行独占模式下.
在共享模式下锁定表EMPLOYEE.
锁定表EMPLOYEE在共享行中独占.
锁定表EMPLOYEE处于独占模式.
我可以选择不止一个.
虽然这看起来像一个微不足道的要求,但事实并非如此.
您可能认为自动增量列或序列将提供无间隙系列但不会:插入期间遇到的任何回滚或错误都会在列中留下空白.序列永远不可信任无间隙.
在多用户环境中,为了确保获得无间隙列,您需要序列化提供数字的过程.实现这一目标的两种主要方式是:
LOCK TABLE IN EXCLUSIVE MODE).正如您所料,这将无法很好地扩展.推迟实际编号.您可以插入所需列设置为null的新行.然后会发布一个后续的单独流程:
UPDATE my_table
SET gap_less_id = (SELECT MAX(gap_less_id) FROM my_table) + rownum
WHERE gap_less_id IS NULL;
Run Code Online (Sandbox Code Playgroud)
您需要确保此后续作业一次只运行一次(例如,参见另一个SO:PL/SQL过程的同步.如何保证程序的执行时间只有一个).
这当然意味着在提交后给予该列的值会延迟,尽管为缩放能力支付的价格可能很小.
我的第一个建议是确保无差距的要求不是虚假的.如果您id在员工表中遗漏了一个真的重要吗?可能不是,这只是用于唯一标识行的主键.您可以使用其他工具计算行数,或按插入时间对行进行排名.在这种情况下使用序列CACHE 0,你不应该丢失太多的ID.
如果这是一个真正的要求,例如法律需要,那么问问自己是否可以使用另一列作为主键.如果您可以接受编号在提交之后进行后编译,则可以使用至少允许并发插入的第二种方法.