全部产品

常见问题

使用柔性事务需要用控制台开启么?

不需要,但是要确保 DRDS 实例升级到支持柔性事务的版本。如果无法使用,请使用 DRDS 控制台自助升级 DRDS 版本。

开启柔性事务是否会影响连接池内的其他连接?

不会,该选项仅在当前会话的事务内有效,用 SET AUTOCOMMIT = off 关闭事务后状态随之清空。

柔性事务在什么情况下有脏读和回滚覆盖风险?

柔性事务只有在事务提交阶段因为网络、数据库或 DRDS 故障导致意外失败后才产生脏读和回滚覆盖风险。正常事务提交、回滚是不会产生脏读和回滚覆盖风险的。

柔性事务能否全局开启?

正确使用柔性事务需要对业务流程做一定优化改造,如果全局开启,可能一些没有经过改造的场景也自动使用了柔性事务,可能造成 “回滚覆盖” 风险。所以目前不建议全局开启。

如何在 Spring 框架中使用 DRDS 事务?

如果使用 Spring 的 @Transactional 注解开启事务,可以通过扩展事务管理器来开启 DRDS 柔性事务。

代码示例:

  1. import org.springframework.jdbc.datasource.DataSourceTransactionManager;
  2. import org.springframework.transaction.TransactionDefinition;
  3. import javax.sql.DataSource;
  4. import java.sql.Connection;
  5. import java.sql.SQLException;
  6. import java.sql.Statement;
  7. public class DrdsFlexibleTransaction extends DataSourceTransactionManager {
  8. public DrdsFlexibleTransaction(DataSource dataSource) {
  9. super(dataSource);
  10. }
  11. @Override
  12. protected void prepareTransactionalConnection(Connection con, TransactionDefinition definition) throws SQLException {
  13. try (Statement stmt = con.createStatement()) {
  14. stmt.executeUpdate("SET drds_transaction_policy = '...'");
  15. }
  16. }
  17. }

之后,在 Spring 配置中将上述类实例化,例如:

  1. <bean id="flexibleTransMgr" class="my.app.DrdsFlexibleTransaction">
  2. <property name="dataSource" ref="yourDataSource" />
  3. </bean>

对于需要开启事务的类,加上注解 @Transactional("flexibleTransMgr") 即可。