我正在寻找一种方法以非锁定方式将一组值与随机 UUID 连接起来,并且不会由于并发限制而导致事务失败。
我需要编辑的表包含几个应该由 UUID 描述的值。在此示例中,表被命名foo
并声明了两个字符串列bar
,qux
它们指向单个字段uuid
。(bar, qux)
要求在整个表中是唯一的。UUID 本质上是独一无二的。
我想知道 SQL(使用 Oracle 12c)是否能够以原子方式执行以下操作:
MERGE INTO foo a
USING (SELECT bar, qux FROM foo b
ON b.bar = 'a' and b.qux = 'b'
WHEN NOT MATCHED THEN INSERT (a.bar, a.qux, a.uuid)
VALUES ('a', 'b', 'some-uuid');
SELECT uuid FROM foo WHERE bar = 'a' and qux = 'b';
作为我的数据库查询的结果,我希望元组(bar, qux)
与随机 UUID 连接。对于任何并发事务,此 UUID 必须相同,并且我不希望竞争请求因为另一个(随机)UUID 的并发插入而失败。
作为背景:这些插入是相当长时间运行的事务的一部分,这些事务在很大程度上彼此独立,但具有这个共享标识符表,其中值不能不一致。许多编程语言都提供 CAS,这就是我在这种情况下所追求的,但我不知道 SQL 中的一个 smilar 特性。
作为一个想法,我想知道允许脏读(未提交的读隔离级别)是否是一种解决方案,但我不知道在这种情况下合并语句是否是原子的并且对其他事务可见。(这在 Oracle 中是不可能的。)通过 JDBC 但可能从多个 VM 节点访问数据库。