我正在寻找一种以非锁定方式将值的元组与随机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中的微笑功能。
作为一个主意,我想知道是否允许脏读(未提交的读隔离级别)将是一种解决方案,但是在这种情况下,我不知道merge语句是否是原子的并且对于其他事务可见。(在Oracle中这是不可能的。)可以通过JDBC访问数据库,但是可以从多个VM节点访问数据库。
您可以将MERGE和SELECT语句封装在使用AUTONOMOUS_TRANSACTION杂注定义的PL / SQL函数中。
如果由于另一个会话刚刚插入了相同的UUID而收到唯一约束冲突,则可以在函数中捕获异常,然后选择并返回UUID。
这样,MERGE语句仅在短时间内锁定记录(只要函数需要执行),并且您不会推断您的应用程序当前事务,因为该函数在单独的事务中运行并且在唯一约束违例的情况。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句