すべてのプロダクト
Search
ドキュメントセンター

PolarDB:MySQL 5.6に基づく分散トランザクション

最終更新日:May 29, 2024

このトピックで説明する分散トランザクションは、5.3.4より前のバージョンのMySQL 5.6または分散リレーショナルデータベースサービス (DRDS) を対象としています。

背景情報

MySQL 5.6のXAプロトコルは成熟していません。 したがって、DRDSは、分散トランザクションの2フェーズコミット (2PC) トランザクションポリシーを独立して実装します。 MySQL 5.7以降のバージョンを使用する場合は、XAトランザクションポリシーを使用することを推奨します。

使用方法

トランザクションに複数のデータベースシャードが含まれる場合は、現在のトランザクションを分散トランザクションとして宣言する必要があります。 トランザクションが1つのデータベースシャードのみを含む場合、分散トランザクションを有効にする必要はありません。 MySQLでは、トランザクションを単一データベーストランザクションとして処理できます。 追加の操作は必要ありません。

分散トランザクションを有効にするには、次の手順を実行します。

トランザクションが有効になったら、SET drds_transaction_policy = '...' を実行します。

MySQLコマンドラインクライアントで2つのPCトランザクションを有効にするには、次のステートメントを実行します。

セットAUTOCOMMIT=0;
SET drds_transaction_policy = '2PC'; -- MySQL 5.6ユーザーに推奨されます。
.... -- ここで、ビジネスSQLステートメントを実行できます。
COMMIT; -代わりにROLLBACKを使用できます。

Javaデータベース接続 (JDBC) APIを使用して2台のPCトランザクションを有効にするには、次のコードを記述します。

conn.setAutoCommit(false);
try (Statement stmt = conn.createStatement()) {
    stmt.exeかわいい ("SET drds_transaction_policy = '2PC'");
}
//... ここで、ビジネスSQL文を実行できます。
conn.com mit(); // 代わりにrollback() を使用できます。

よくある質問

Q: SpringフレームワークでDRDS分散トランザクションを使用するにはどうすればよいですか?

A: Springの @ Transactionalアノテーションを使用してトランザクションを有効にする場合、トランザクションマネージャーを拡張することでDRDS分散トランザクションを有効にできます。

サンプルコード:

org.springframework.jdbc.datasource.DataSourceTransactionManagerをインポートします。org.springframework.transaction.TransactionDefinitionをインポートします。javax.sql.DataSourceをインポートします。java.sql.Connectionをインポートします。java.sql.SQLExceptionをインポートします。java.sql.Statementをインポートします。パブリッククラスDrdsTransactionManagerがDataSourceTransactionManagerを拡張 {

    パブリックDrdsTransactionManager(DataSource dataSource) {
        スーパー (dataSource);
    }

    @Override
    protected void prepareTransactionalConnection(Connection con, TransactionDefinition) throws SQLException {
        try (Statement stmt = con.createStatement()) {
            stmt.exe cuteUpdate("SET drds_transaction_policy = '2PC'"); // この場合、2PCトランザクションが例として使用されます。
        }
    }
}

その後、Spring構成で前のクラスをインスタンス化します。 次の例のようにコードを書くことができます。

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

DRDS分散トランザクションを有効にする必要があるクラスでは、@ Transactional("drdsTransactionManager") アノテーションを追加できます。