本文介紹如何使用柔性事務(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í)行一次。
增量回滾
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)。