本文描述的分布式事务适用于MySQL 5.6版本,或版本早于5.3.4的DRDS实例。
基本原理
关于分布式事务的原理,详情请参见分布式事务基本原理。
对于 MySQL 5.6 版本,由于 MySQL XA 协议实现尚不成熟,PolarDB-X自主实现了 2PC 事务策略用于分布式事务。MySQL 5.7 及更高版本中,推荐您使用 XA 事务策略。
如何使用
如果某个事务可能涉及多个数据分库,则需要将当前事务声明为分布式事务。如果事务仅涉及单个数据分库,则无需开启分布式事务,直接像 MySQL 单机事务那样即可,无需额外操作。
分布式事务开启方式如下:
在事务开启后,执行 SET drds_transaction_policy = '...' 即可。
MySQL 命令行客户端使用示例(以2PC事务为例)
SET AUTOCOMMIT=0;SET drds_transaction_policy ='2PC';--建议MySQL5.6用户使用....--业务 SQLCOMMIT;--或 ROLLBACK
Java JDBC 代码示例(以 2PC 事务为例)
conn.setAutoCommit(false);try(Statement stmt = conn.createStatement()){stmt.execute("SET drds_transaction_policy = '2PC'");}// ... 运行业务 SQL ...conn.commit();// 或 rollback()
常见问题
如何在 Spring 框架中使用PolarDB-X分布式事务?
如果使用 Spring 的 @Transactional 注解开启事务,可以通过扩展事务管理器来开启PolarDB-X分布式事务。
代码示例:
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;publicclassDrdsTransactionManagerextendsDataSourceTransactionManager{publicDrdsTransactionManager(DataSource dataSource){super(dataSource);}@Overrideprotectedvoid prepareTransactionalConnection(Connection con,TransactionDefinition definition)throwsSQLException{try(Statement stmt = con.createStatement()){stmt.executeUpdate("SET drds_transaction_policy = '2PC'");// 以 2PC 为例}}}
之后,在 Spring 配置中将上述类实例化,例如:
id="drdsTransactionManager"class="my.app.DrdsTransactionManager">name="dataSource"ref="yourDataSource"/>
对于需要开启PolarDB-X分布式事务的类,加上注解 @Transactional("drdsTransactionManager") 即可。