一、背景介绍
- Hive 在设计之初时,是不支持事务操作的,因为 Hive 的核心目标是将已存在的结构化数据文件映射成表,然后提供基于表的SQL分析处理;是一款面向分析的工具。且映射的文件存在 HDFS 中,其本身也不支持随机修改文件的数据
- 这个定位就意味着早期的 HQL 本身就不支持 update、delete 语法,也就没有所谓的事务支持
- 从 Hive 0.14版本开始,具有 ACID 语义的事务已添加到 Hive 中,以解决缓慢变化维表或部分数据不正确,需要更正的情况
- 最终 Hive 支持了具有 ACID 语义的事务,但做不到和传统关系型数据库那样的事务级别,仍有很多局限如:
- 不支持
begin
、commit
、rollback
,所有操作自动提交 - 仅支持
orc
文件格式 - 默认事务关闭,需要额外配置
- 表参数
transactional
必须为true
- 外部表不能成为 ACID 表,不允许从非 ACID 会话读取/写入 ACID 表
- 不支持
二、实操
开启事务
# 开启 hive 并发
set hive.support.concurrency = true;
# 配置事务管理类,默认
set hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
创建事务表
create table tran_ts
(
id int,
name string
) clustered by (id) into 4 buckets
stored as orc
tblproperties ('transactional' = 'true');
进行事务操作
insert into tran_ts values (1, 'zs');
update tran_ts set name = 'zhang' where id = 1;
delete from tran_ts where id = 1;
底层并不会修改数据
如何理解:不允许从非 ACID 会话读取/写入 ACID 表?
当前会话由于开启了事务,所以可以查询这张事务表,当开启一个新的会话直接查询就会报错