什么事本地事务?

本地事务的概念


也就是基于关系型数据库的事务,也称为传统事务.

常见模式:如
transaction begin
insert/delete/update

transaction commit/rollback

本地事务的特征

  1. 一次事务过程中只能连接一个支持关系型数据库.
  2. 事务的执行结果满足ACID
  3. 事务执行的过程中会用到数据库本身的锁机制.

ACID


也就是我们平常说的 原子性 一致性 隔离性和持久性.

  • 原子性: 指构成事务的所有操作,要么全部成功,要么全部失败.
  • 一致性: 指事务执行前和执行之后,数据始终处于一致的状态.
  • 隔离性: 指并发事务在执行的过程中,事务之间互不 干扰.
  • 持久性: 指事务提交完成之后,此事务针对数据的操作会持久话到数据库,不会发生更改.
分布式系统中,**事务消息**是一种用于保证**消息发送与本地事务处理**保持一致性的机制。它解决了在异步通信中,**业务操作与消息发送之间的原子性问题**,确保系统在高并发和分布式环境下数据的**最终一致性**。 --- ### ✅ 事务消息的背景与需求 在传统系统中,业务操作(如数据库写入)和消息发送通常是两个独立的操作: ```java // 伪代码 updateDatabase(); // 1. 更新本地数据库 sendMessage(); // 2. 发送消息到消息队列 ``` 这两个操作如果不能保证原子性,就可能出现以下问题: | 场景 | 问题描述 | |------|----------| | 数据库更新成功,但消息发送失败 | 消息未发送,下游系统无法感知,导致数据不一致 | | 数据库更新失败,但消息发送成功 | 下游系统执行后续操作,但本地无记录,导致数据异常 | --- ### ✅ 事务消息的定义 **事务消息**(Transactional Message)是指: > 一个消息的发送操作可以与本地事务(如数据库事务)绑定,保证两者要么都成功,要么都失败。 它通常由消息中间件(如 RocketMQ、Kafka、RabbitMQ 插件)提供支持。 --- ### ✅ 事务消息的工作流程(以 RocketMQ 为例) 1. **发送半消息(Half Message)** - 消息先被发送到 Broker,但对消费者不可见。 2. **执行本地事务(如数据库操作)** 3. **提交或回滚事务** - 如果本地事务成功,则提交消息,消费者可以消费。 - 如果失败,则回滚消息,消息被丢弃。 4. **事务状态回查(Check)** - 如果事务状态未知(如超时),Broker 会回调事务状态查询接口,确认事务结果。 --- ### ✅ 事务消息的应用场景 | 场景 | 说明 | |------|------| | 订单创建后通知库存系统 | 确保订单创建成功才发送消息 | | 支付完成后触发积分增加 | 保证支付与积分系统一致性 | | 银行转账系统 | 转账操作与日志/通知消息必须一致 | | 分布式订单系统 | 保证订单状态变更与下游系统同步 | --- ### ✅ 事务消息的优点 | 优点 | 描述 | |------|------| | 保证数据一致性 | 本地事务和消息发送保持原子性 | | 提高系统可靠性 | 避免消息丢失或误发导致的数据异常 | | 支持最终一致性 | 即使出现异常,也支持事务状态回查机制 | --- ### ✅ 事务消息 vs 普通消息 | 对比项 | 普通消息 | 事务消息 | |--------|----------|-----------| | 原子性 | 不保证 | 保证与本地事务一致 | | 实现复杂度 | 低 | 较高(需实现事务监听器) | | 消息状态 | 直接可见 | 半消息机制 | | 适用场景 | 异步通知、日志等 | 核心业务操作、数据一致性要求高的场景 | --- ### ✅ 示例代码(RocketMQ 事务消息) ```java TransactionListener transactionListener = new TransactionListener() { @Override public LocalTransactionState executeLocalTransaction(Message msg, Object arg) { // 执行本地事务(如数据库操作) boolean success = updateDatabase(); if (success) { return LocalTransactionState.COMMIT_MESSAGE; } else { return LocalTransactionState.ROLLBACK_MESSAGE; } } @Override public LocalTransactionState checkLocalTransaction(MessageExt msg) { // 回查事务状态 return getTransactionState(); } }; TransactionMQProducer producer = new TransactionMQProducer("ProducerGroup"); producer.setNamesrvAddr("localhost:9876"); producer.setTransactionListener(transactionListener); producer.start(); Message msg = new Message("OrderTopic", "create_order".getBytes()); SendResult sendResult = producer.sendMessageInTransaction(msg, null); ``` --- ### ✅ 总结 事务消息是分布式系统中保障**消息发送与业务操作一致性**的重要手段,它解决了传统方式中可能出现的数据不一致问题,适用于金融、电商、支付等对数据一致性要求较高的场景。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值