总结:做计数器可能会用到,但是由于限制太多,没什么用,知道即可。
为了支持原子更新,在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.
网友评论