全部产品
云市场

如何使用

更新时间:2018-04-28 10:43:56

DRDS 柔性事务的原理参考 DRDS 分布式事务

开启柔性事务

在事务开启后,执行 SET drds_transaction_policy = 'FLEXIBLE' 即可。

  1. mysql> SET drds_transaction_policy = 'flexible';
  2. mysql> SHOW VARIABLES LIKE 'drds_transaction_policy';
  3. +-------------------------+----------+
  4. | VARIABLE_NAME | VALUE |
  5. +-------------------------+----------+
  6. | drds_transaction_policy | FLEXIBLE |
  7. +-------------------------+----------+
  8. 1 row in set (0.07 sec)

Java 代码示例:

  1. conn.setAutoCommit(false);
  2. try (Statement stmt = conn.createStatement()) {
  3. stmt.execute("set drds_transaction_policy = 'flexible'");
  4. }
  5. // ... 运行业务 SQL ...
  6. conn.commit(); // 或 rollback()

注意:

  1. 只允许在 SET autocommit = 0 的前提下设置 drds_transaction_policy 属性,否则报错。

  2. 当前会话中设置的 drds_transaction_policy 属性会在 SET autocommit = 1 后自动重置。

SQL 后置执行

后置执行是 DRDS 柔性事务提供的一项功能,帮助您进一步提高事务性能。

声明为后置执行的 SQL 将在事务成功后被执行,从而保证最终一致性。将不影响事务结果的 SQL 声明为后置执行,能进一步减少事务锁的粒度,提高吞吐量。

使用 Hint /*TDDL:DEFER*/ 可将 SQL 标记为后置执行,例如:

  1. /*TDDL:DEFER*/ UPDATE accounts SET balance = balance + 100 WHERE id = 'B';

也可以和其他 Hint 可以混合使用,例如:

  1. /*TDDL:NODE=1 AND DEFER*/ UPDATE accounts SET balance = balance + 100 WHERE id = 'B';

DRDS 保证后置执行的 SQL 一定且仅成功执行一次。

注:DRDS 5.3.1 暂不支持后置执行。

增量回滚

DRDS 柔性事务对于 “增量操作” 的回滚有专门优化。

当事务中的 UPDATE 语句包含 “增量操作”,例如:balance = balance - 100,则会在回滚语句中使用 balance = balance + 100 进行补偿。由于 “增量操作” 的结果与顺序无关,这样即使事务异步回滚,也不会覆盖其他业务的更新结果。

增量操作的定义是 UPDATE 语句符合以下格式:

  1. UPDATE {表名} SET {列名} = {列名} [+/-] {常量表达式}, ... WHERE {条件表达式}

示例:

  1. UPDATE account SET balance = balance - 100 WHERE id = 'B' AND balance >= 100

DRDS 自动生成的回滚语句是:

  1. UPDATE account SET balance = balance + 100 WHERE id = 'B'

增量回滚对账户、积分、库存这样的字段非常有用,而这些字段又经常是需要用分布式事务严格保证一致性的关键数据。建议在应用中尽量对这一类字段采用 “增量操作” 的方式更新,既节省了一次数据库操作(SELECT),又避免了柔性事务 “回滚覆盖” 的风险。