本文描述的分散式交易針對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")即可。