美文网首页
Apache Phoenix(六)新特性之原子插入

Apache Phoenix(六)新特性之原子插入

作者: 我知他风雨兼程途径日暮不赏 | 来源:发表于2020-02-13 16:45 被阅读0次

  总结:做计数器可能会用到,但是由于限制太多,没什么用,知道即可。
  为了支持原子更新,在Phoenix 4.9中,一个类似MYSQL语法的可选择OP DUPLICATE KEY被嵌入到UPSERT VALUES命令中去提供。这里描述了通语语法跳转。这个特性提供了超集的Hbase的新增和CheckAndPut函数启动原子更新。在服务器端,当一个提交被处理,在读取当前列的值和ON DUPLICATE KEY子句执行时,被更新的行将被锁住。如果使用ON DUPLICATE KEY子句时必须锁定读取的行,将会产生性能的损失(与Hbase的Put和CheckAndPut相似)。
  在存在ON DUPLICATE KEY子句时,如果行已经存在,这个指定的值将会被忽略,取而代之的是下面两种情况:

  • 该行不会被更新,如果ON DUPLICATE KEY IGNORE 是指定的。
  • 该行会被更新(在锁下)通过执行ON DUPLICATE KEY UPDATE子句后面的表达式。
      多个UPSERT针对同一行,在同一批次提交的处理按照其顺序进行执行。因此,当自动提交处于开启或者关闭状态时,将产生相同的结果。

例子

  举例,原子递增两个计数器列,你需要执行以下命令:

UPSERT INTO my_table(id, counter1, counter2) VALUES ('abc', 0, 0)
ON DUPLICATE KEY UPDATE counter1 = counter1 + 1, counter2 = counter2 + 1;

  只更新一个列,如果它还不存在:

UPSERT INTO my_table(id, my_col) VALUES ('abc', 100)
ON DUPLICATE KEY IGNORE;

  注意,在这个新子句可以使用复杂的表达式:

UPSERT INTO my_table(id, total_deal_size, deal_size) VALUES ('abc', 0, 100)
ON DUPLICATE KEY UPDATE
    total_deal_size = total_deal_size + deal_size,
    approval_reqd = CASE WHEN total_deal_size < 100 THEN 'NONE'
    WHEN total_deal_size < 1000 THEN 'MANAGER APPROVAL'
    ELSE 'VP APPROVAL' END;

限制

  下面的限制强制在ON DUPLICATE KEY子句中使用:

  • 主键列不会更新,因为这实际上是在创建新行。
  • 事务表不能使用这个子句在原子更新上,因为已经通过异常控制来解决冲突的发生。
  • 不可变表不能使用子句,根据定义,不允许更新现有存在的行。
  • CURRENT_SCN属性不能设置在连接上,当子句被使用在Hbase时,除非更新了最新值,否作不处理原子性。
  • 相同的列不能在同一语句中多次更新。
  • 子句中不允许出现聚合或者引用排序
  • 全局索引在列上原子更新不被支持,因为可能会锁定以维护二级索引时跨线路创建单独的RPC.

相关文章

网友评论

      本文标题:Apache Phoenix(六)新特性之原子插入

      本文链接:https://www.haomeiwen.com/subject/etflfhtx.html