华为云云数据库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)
内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家