本文介紹了使用柔性事務的常見問題。
使用柔性事務需要用控制臺開啟么?
不需要,但是要確保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")
即可。