分布式事务1-mysql分布式事务

单机事务
事务的隔离性是通过数据库锁的机制实现的,持久性通过redo log(重做日志)来实现,原子性和一致性通过Undo log来实现。
分布式事务
本质上来说,分布式事务就是为了保证不同数据库的数据一致性。

分布式事务产生的原因

从上面本地事务来看,我们可以分为两块:

Service 产生多个节点----微服务倡导将复杂的单体应用拆分为若干个功能简单、松耦合的服务
Resource 产生多个节点------分库分表

mysql分布式事务

MySQL 5.6 版本-----2PC 事务策略
如果某个事务可能涉及多个数据分库,则需要将当前事务声明为分布式事务。

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 框架中使用 DRDS 分布式事务?
如果使用 Spring 的 @Transactional 注解开启事务,可以通过扩展事务管理器来开启 DRDS 分布式事务。

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>

对于需要开启 DRDS 分布式事务的类,加上注解 @Transactional(“drdsTransactionManager”) 即可。

MySQL 版本 ≥ 5.7,并且 DRDS 版本 ≥ 5.3.4 ------- XA 分布式事务
DRDS 分布式事务使用体验和单机 MySQL 数据库完全一致,例如:

SET AUTOCOMMIT=0 开启一个事务;
COMMIT 提交当前事务;
ROLLBACK 回滚当前事务。
如果事务中的 SQL 仅涉及单个分片,DRDS 会将其作为单机事务直接下发给 MySQL;如果事务中的 SQL 语句修改了多个分片的数据,DRDS 会自动地将当前事务升级为分布式事务。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值