Hologres支持完整的DDL事务以及部分DML事务,默认支持单条SQL事务。本文将会为您介绍Hologres的事务支持能力。
事务的支持场景
Hologres对事务的支持场景和使用说明如下:
支持多条DDL语句事务
事务内多个表的创建与回滚支持事务保障,示例如下:
begin; drop table if exists ddl_test; create table ddl_test( uid text not null, name text not null); commit;
支持多条DML混合事务(Beta)
Hologres从V2.0版本开始支持同一个事务内的混合DML。通过混合DML事务的支持,可以保证同一个SQL中混合DML的原子性和一致性,尤其使数据写入时能保证一致性,从而使得Hologres也适用轻TP的场景。但需要注意的是:一个事务中如果有混合DML,无法最大程度的利用Hologres的分布式能力,会使得混合DML无法支撑高QPS的场景。
应用场景:混合DML在同一个事务中,可以保证数据写入、更新、删除的一致性。
注意事项:
混合DML事务只支持低QPS场景,不适用于高并发场合,具体QPS支持请进行实际业务测试。
如果一个事务中,既有写入又有查询,查询性能会低于不使用事务,具体性能损失请以实际为准。
同一个事务中,读、写、删除、更新等请求均在表级别加写锁,会导致同一个表的多个事务只能串行执行,示例如下。
当前混合DML事务存在已知问题:在混合DML事务中,如果对DML语句执行Cancel操作之后进行Rollback,引擎中事务会有残留,对应的表级别锁不会被释放。示例如下:
set hg_experimental_enable_transaction = on; begin; insert into dml_test select i from generate_series(1,100000) t(i); -- 对insert into执行cancel rollback; -- dml_test被锁住
使用说明:
目前混合DML事务默认关闭,需要通过如下GUC参数开启:
set hg_experimental_enable_transaction = on;
开启混合DML事务后,在一个事务中可包含多个DML:
如果其中一个DML失败,那么系统会自动将事务内的DML进行回滚,其余DML会自动失败。
如果DML正在正常执行中,因为某种原因想回滚,可以对事务执行回滚,这样就会自动将事务中的DML回滚。
set hg_experimental_enable_transaction = on; begin ; delete from dml_test; insert into dml_test values (1,'sss'); rollback;
暂不支持DDL和DML混合事务。
如下示例,DDL和DML在同一个事务中会报错:
ERROR: INSERT in ddl transaction is not supported now
。begin; drop table if exists dml_test; create table dml_test ( uid text not null, name text not null); insert into dml_test values('1','tom'); commit;