我正在使用带有计数器的表格,以确保子元素上的唯一ID。
我知道通常使用序列会更好,但是我不能使用它,因为我有很多计数器(客户可以创建几个存储桶,每个存储桶都需要有自己的计数器,因此必须以1(这是一个要求,我的客户需要“人类可读”的 key )。
我正在创建具有prikey(bucket_id,num =计数器)的记录(我们称其为项目)。
我需要保证bucket_id/num组合是唯一的(因此使用序列作为prikey不能解决我的问题)。
在pl/sql中不会发生行的创建,因此我需要声明该数字(顺便说一句:存在间隙并不违反要求)。
我的解决方案是:
UPDATE bucket
SET counter = counter + 1
WHERE id = param_id
RETURNING counter INTO num_forprikey;
PL/SQL返回var_num_forprikey,以便可以创建项目记录。
问题:
即使用户同时请求存储桶中的新商品,我也会始终获得唯一的num_forprikey吗?
最佳答案
是的,至少到了一定程度。第一个发布该更新的用户将锁定该行。因此,在用户numero uno提交(或回滚)之前,没有其他用户可以成功发出相同的语句。因此,保证了唯一性。
显然,讨论与并发有关。您对该行的访问已序列化,因此两个用户无法同时获取新的PRIKEY。这不一定是问题。这取决于您创建新项目的用户数量以及他们执行此操作的频率。一个用户在同一 session 中剥离数字不会引起任何注意。
关于Oracle(PL/SQL): Is UPDATE RETURNING concurrent?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2930704/