华为云云数据库GaussDB事务_云淘科技

在GTM-FREE模式下,不允许执行跨节点事务。

在GTM-FREE模式下,如果所执行的SQL语句包含跨节点事务,会报错处理。

如果语句拆分多条会报错:

INSERT/UPDATE/DELETE/MERGE contains multiple remote queries under GTM-free modeUnsupport DML two phase commit under gtm free mode. modify your SQL to generate light-proxy or fast-query-shipping plan。

此时需要修改语句,来单节点执行。

如果语句涉及多节点会报错:

Your SQL needs more than one datanode to be involved in.

建议对语句进行修改,使得能够单节点执行。如果需要此种语句多节点执行,需要添加一个hint来允许,例如:insert /*+ multinode */ into t values(3,3),(1,1);

建议开发阶段在jdbc连接串内设置application_type=perfect_sharding_type,这样所有跨节点读写操作的SQL都会报错,用来提示开发人员尽早优化语句。

大对象操作不支持事务。

大对象操作包括:创建删除DATABASE, ANAYLIZE, VACCUM。

通过JDBC接入数据库时,避免拼接多条SQL为一条语句发送执行。

当多条语句拼接为一条语句,且其中包含对象操作时,如果中间对象操作失败,会重新开启新事务执行后续语句。

示例:不符合规则语句

Connection conn = .... 
try { 
    Statement stmt = null; 
    try { 
        stmt = conn.createStatement(); 
        stmt.executeUpdate("CREATE TABLE t1 (a int); DROP TABLE t1"); 
    } finally { 
        stmt.close(); 
    } 
    conn.commit(); 
} catch(Exception e) { 
   conn.rollback(); 
} finally { 
   conn.close(); 
}

上述执行语句,如果“CREATE TABLE t1;”失败,会重新开启新事务执行“DROP TABLE t1;”导致执行失败。应拆分成两条语句分别发送:

Connection conn = .... 
try { 
    Statement stmt = null; 
    try { 
        stmt = conn.createStatement(); 
        stmt.executeUpdate("CREATE TABLE t1 (a int)"); 
        stmt.executeUpdate("DROP TABLE t1"); 
    } finally { 
        stmt.close(); 
    } 
    conn.commit(); 
} catch(Exception e) { 
   conn.rollback(); 
} finally { 
   conn.close(); 
}

父主题: 数据库编程规范

同意关联代理商云淘科技,购买华为云产品更优惠(QQ 78315851)

内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家