本文介绍了使用柔性事务的常见问题。
使用柔性事务需要用控制台开启么?
不需要,但是要确保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")
即可。