有没有办法自动执行SQL合并?

拉斐尔·温特豪德

我正在寻找一种以非锁定方式将值的元组与随机UUID连接并且不会由于并发约束而导致事务失败的方法。

我需要编辑的表包含几个应该由UUID描述的值。在此示例中,表被命名foo并声明了两个字符串列barqux它们指向单个字段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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章