本文介紹了使用柔性事務的常見問題。

使用柔性事務需要用控制臺開啟么?

不需要,但是要確保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") 即可。