Oracle(PL/SQL):UPDATE RETURNING并发吗?

Jaa*_*aap 5 oracle concurrency plsql

我正在使用带有计数器的表来确保子元素上的唯一id.

我知道使用序列通常更好,但我不能使用它,因为我有很多计数器(客户可以创建几个桶,每个都需要有自己的计数器,他们必须从1(这是一项要求,我的客户需要"人类可读的"键).

我正在创建具有prikey的记录(让我们称之为项目)(bucket_id,num = counter).

我需要保证bucket_id/num组合是唯一的(因此使用序列作为prikey不会解决我的问题).

在pl/sql中不会发生行的创建,因此我需要声明数字(顺便说一下:它不符合要求有间隙).

我的解决方案是:

   UPDATE bucket
      SET counter = counter + 1
    WHERE id = param_id
RETURNING counter INTO num_forprikey;
Run Code Online (Sandbox Code Playgroud)

PL/SQL返回var_num_forprikey,因此可以创建项记录.

题:

即使用户同时要求存储桶中的新项目,我是否总能获得唯一的num_forprikey?

APC*_*APC 7

即使用户同时要求存储桶中的新项目,我是否总能获得唯一的num_forprikey?

是的,至少达到一定程度.发出该更新的第一个用户获取该行的锁定.因此,在用户进行uno提交(或回滚)之前,没有其他用户可以成功发出相同的语句.所以保证了独特性.

显然,这个空洞是关于并发性的.您对该行的访问是序列化的,因此两个用户无法同时获得新的PRIKEY.这不一定是个问题.这取决于您创建新项目的用户数量,以及他们执行此操作的频率.一个用户在同一会话中剥离数字将不会发现任何事情.

  • APC说实话.但是,如果会话不提交更新,这是让应用程序停止运行的好方法. (4认同)