本文介绍了柔性事务的注意事项。
脏读
由于PolarDB-X 1.0柔性事务使用异步方式回滚,在提交失败后可能有一些分库的数据在异步回滚前对外可见,出现脏读。
建议应用在业务操作前对数据进行二次校验,防止脏读带来的影响。对于一些有风险的数据,建议采用调整事务SQL顺序,或者后置执行的方式避免脏读。
由于PolarDB-X 1.0柔性事务的特殊机制,事务中执行的第一条INSERTY、UPDATE或DELETE语句不会采用异步方式回滚。因此将有风险的SQL语句提前执行,可以有效防止脏读。
回滚覆盖
由于PolarDB-X 1.0柔性事务使用异步方式回滚,在回滚成功前,脏数据可能被同时执行的业务提前修改,产生回滚覆盖问题。
避免回滚覆盖的方法与脏读类似,可以采用调整事务SQL顺序,或后置执行的方式解决。
另外对于金额、积分、库存这一类关键数据,可以采用增量更新的方式修改,完全避免回滚覆盖问题。例如,下面就是一个增量更新的SQL语句:
UPDATE account SET balance = balance - 100 WHERE id = 'B' AND balance >= 100
更新顺序
PolarDB-X 1.0事务提供的后置执行无法保证后置SQL执行的顺序和事务提交顺序相同。
采用增量更新可以避免这一问题,例如:
/*TDDL:DEFER*/ UPDATE account SET balance = balance + 100 WHERE id = 'A'
由于增量更新的执行结果与顺序无关,因此可以防止执行顺序产生的数据不一致问题。