本文介紹如何使用柔性事務(wù)。

開(kāi)啟柔性事務(wù)

在事務(wù)開(kāi)啟后,執(zhí)行SET drds_transaction_policy = 'FLEXIBLE'即可。

mysql> SET drds_transaction_policy = 'flexible';

mysql> SHOW VARIABLES LIKE 'drds_transaction_policy'; 
+-------------------------+----------+
| VARIABLE_NAME           | VALUE    |
+-------------------------+----------+
| drds_transaction_policy | FLEXIBLE |
+-------------------------+----------+
1 row in set (0.07 sec)

Java代碼示例:

conn.setAutoCommit(false);

try (Statement stmt = conn.createStatement()) {
    stmt.execute("set drds_transaction_policy = 'flexible'");
}

// ... 運(yùn)行業(yè)務(wù) SQL ...
conn.commit(); // 或 rollback()
注意
  • 只允許在SET autocommit = 0的前提下設(shè)置drds_transaction_policy屬性,否則報(bào)錯(cuò)。
  • 當(dāng)前會(huì)話中設(shè)置的drds_transaction_policy屬性會(huì)在SET autocommit = 1后自動(dòng)重置。

SQL后置執(zhí)行

后置執(zhí)行是PolarDB-X 1.0柔性事務(wù)提供的一項(xiàng)功能,幫助您進(jìn)一步提高事務(wù)性能。

聲明為后置執(zhí)行的SQL將在事務(wù)成功后被執(zhí)行,從而保證最終一致性。將不影響事務(wù)結(jié)果的SQL聲明為后置執(zhí)行,能進(jìn)一步減少事務(wù)鎖的粒度,提高吞吐量。

使用 Hint /*TDDL:DEFER*/ 可將SQL標(biāo)記為后置執(zhí)行,例如:

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

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

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

PolarDB-X 1.0保證后置執(zhí)行的SQL一定且僅成功執(zhí)行一次。

說(shuō)明 5.3.1版本暫不支持后置執(zhí)行。

增量回滾

PolarDB-X 1.0柔性事務(wù)對(duì)于“增量操作”的回滾有專(zhuān)門(mén)優(yōu)化。

當(dāng)事務(wù)中的UPDATE語(yǔ)句包含增量操作,例如:balance = balance - 100,則會(huì)在回滾語(yǔ)句中使用balance = balance + 100進(jìn)行補(bǔ)償。由于增量操作的結(jié)果與順序無(wú)關(guān),這樣即使事務(wù)異步回滾,也不會(huì)覆蓋其他業(yè)務(wù)的更新結(jié)果。

增量操作的定義是UPDATE語(yǔ)句符合以下格式:

UPDATE {表名} SET {列名} = {列名} [+/-] {常量表達(dá)式}, ... WHERE {條件表達(dá)式}

示例:

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

PolarDB-X 1.0自動(dòng)生成的回滾語(yǔ)句為:

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

增量回滾對(duì)賬戶(hù)、積分、庫(kù)存這樣的字段非常有用,而這些字段又經(jīng)常是需要用分布式事務(wù)嚴(yán)格保證一致性的關(guān)鍵數(shù)據(jù)。建議在應(yīng)用中盡量對(duì)這一類(lèi)字段采用“增量操作”的方式更新,既節(jié)省了一次數(shù)據(jù)庫(kù)操作(SELECT),又避免了柔性事務(wù)“回滾覆蓋”的風(fēng)險(xiǎn)。