本文介绍了使用柔性事务的常见问题。

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

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

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

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

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

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

柔性事务能否全局开启?

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

如何在Spring框架中使用PolarDB-X 1.0事务?

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

代码示例:

import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.TransactionDefinition;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

public class DrdsFlexibleTransaction extends DataSourceTransactionManager {

    public DrdsFlexibleTransaction(DataSource dataSource) {
        super(dataSource);
    }

    @Override
    protected void prepareTransactionalConnection(Connection con, TransactionDefinition definition) throws SQLException {
        try (Statement stmt = con.createStatement()) {
            stmt.executeUpdate("SET drds_transaction_policy = '...'");
        }
    }
}

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

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

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