Transactions
Phoenix依赖Tephra实现了行间,表间的事务支持。Tephra 提供 snapshot 隔离当前事务通过实现多版本并行控制
步骤:
一、hbase-site.xml 开启事务
<property>
<name>phoenix.transactions.enabled</name>
<value>true</value>
</property>
二、hbase-site.xml 配置事务管理
<property>
<name>data.tx.snapshot.dir</name>
<value>/tmp/tephra/snapshots</value>
</property>
<property>
<name>data.tx.timeout</name>
<value>60</value>
<description>事务超时时间</description>
</property>
三、启动事务管理
tephra
* 事务配置在master node
事务的开启
CREATE TABLE my_table(k BIGINT PRIMARY KEY,v VARCHAR) TRANSACTIONAL = true;
* 不能把一个事务表,变成非事务表;能把非事务表变成事务表
ALTER TABLE my_other_table SET TRANSACTIONAL=true;
查询时,事务的启动,要事务表上执行一个声明,结束事务通过 commit or rollback。事务中可以查看没有提交的数据
SELECT * FROM my_table; -- this will start a transaction
UPSERT INTO my_table VALUES (1,'A');
SELECT count(*) FROM my_table WHERE k = 1; will see uuncommitted row
DELETE FROM my_other_table WHERE k = 2;
!commit -- other transactions will now see your udpates and you will see theirs
如果有两个事务同时操作一条语句,会抛出异常,案例如下:
事务一:
UPSERT INTO my_table VALUES(1,'A')
事务二:
UPSERT INTO my_table VALUES(1,'B')
!commit
查询只能查看查询已经提交的,不能查看正在执行事务中的值
索引与table的事务是一致的,在commit期间,如果index或者data table 写异常,客户端将回滚或者重试的,如果提交失败,index,data table rows 是不可见
外部的Tephra 事物已经启动,能够被Phoenix设置为事物
setTransactionContext(TransactionContext txContext)
limitations
1.在SCN连接集上启动事物是不被允许的
2.设置最大版本属性当创建一个事物表时,限制并行事物数的可用快照
3.如果事物不能回滚或超时时,产生一个无效列表。如果有很多失败和超时事物,列表会变大。adminstrator能手动清理列表中的事物,在 major compaction出现后。