更新时间:2024-01-12 GMT+08:00
分享

事务

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

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

    1. 如果语句拆分多条会报错:
      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。

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

    2. 如果语句涉及多节点会报错:
      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, ANALYZE, VACUUM。

  • 通过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(); 
    }
分享:

    相关文档

    相关产品