全部產品
Search
文件中心

PolarDB:基於MySQL 5.6的分散式交易

更新時間:Jul 06, 2024

本文描述的分散式交易針對MySQL 5.6版本使用者,或PolarDB-X 1.0版本低於5.3.4的使用者。

基本原理

對於MySQL 5.6版本,由於MySQL XA協議實現尚不成熟,PolarDB-X 1.0自主實現了2PC事務策略用於分散式交易。MySQL 5.7及更高版本中,推薦您使用XA事務策略。

如何使用

如果某個事務可能涉及多個資料分庫,則需要將當前事務聲明為分散式交易。如果事務僅涉及單個資料分庫,則無需開啟分散式交易,直接像MySQL單機事務那樣即可,無需額外操作。

分散式交易開啟方式如下:

在事務開啟後,執行SET drds_transaction_policy = '...'即可。

MySQL命令列用戶端使用樣本(以2PC事務為例):

SET AUTOCOMMIT=0;
SET drds_transaction_policy = '2PC'; -- 建議MySQL 5.6使用者使用
.... -- 業務SQL
COMMIT; -- 或ROLLBACK
            

Java JDBC程式碼範例(以2PC事務為例):

conn.setAutoCommit(false);
try (Statement stmt = conn.createStatement()) {
    stmt.execute("SET drds_transaction_policy = '2PC'");
}
// ... 運行業務SQL ...
conn.commit(); //或rollback()
            

常見問題

如何在Spring架構中使用分散式交易?

如果使用Spring的@Transactional註解開啟事務,可以通過擴充交易管理員來開啟PolarDB-X 1.0分散式交易。

程式碼範例:

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 DrdsTransactionManager extends DataSourceTransactionManager {

    public DrdsTransactionManager(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 = '2PC'"); // 以 2PC 為例
        }
    }
}
            

之後,在Spring配置中將上述類執行個體化,例如:

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

對於需要開啟PolarDB-X 1.0分散式交易的類,加上註解@Transactional("drdsTransactionManager")即可。