更新时间:2026-10-21 GMT+08:00
事务
- 【规格】非透明多写特性下,在GTM-FREE模式下,不允许执行跨节点事务。
在GTM-FREE模式下,如果所执行的SQL语句包含跨节点事务,会报错:Unsupport DML two phase commit under gtm free mode.
在这种情况下,如果某一条语句必须临时开启跨节点事务,需要在事务中先执行如下命令开启跨节点事务:
SET enable_twophase_commit = on;
并在事务结束前执行如下命令:
RESET enable_twophase_commit;
或者:
SET enable_twophase_commit = off;
- 【规格】大对象操作不支持事务。
非透明多写特性下,大对象操作包括:创建删除DATABASE、ANALYZE、VACUUM。
- 【规则】通过JDBC客户端接入时,关闭autocommit参数,显式执行事务的COMMIT。
- 开启autocommit参数,会导致部分参数(如fetchsize)失效。
- 业务应明确业务逻辑,减少对数据库的依赖。
- 【规则】业务运行过程中应注意长事务管理。针对执行时间超1小时的长事务,应遵循业界规范,执行结束后及时提交,释放锁、线程等资源,同时避免因死元组回收不及时、UNDO膨胀、Xlog堆积、复制槽不推进等问题导致磁盘空间快速增长和SQL执行性能下降。
- 【建议】根据业务使用情况综合制定子事务使用规范。子事务过多会对性能等造成较大影响,不得滥用,建议子事务数量不超过1000。
- 【建议】针对长时间未提交或回滚的空闲事务,可设置空闲事务超时时间(idle_in_transaction_timeout)以开启自动查杀功能。
- 【规则】通过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(); } - 建议拆分成两条语句分别发送:
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(); }
- 不符合规则语句
父主题: 数据库编程规范