事务管理 vs. 锁控制:你真的分得清吗?何时使用何种并发控制策略?

news/2024/6/29 12:14:02 标签: , 事务, 分布式

分布式事务分布式系统中两个重要的概念,它们都用于解决分布式环境下的数据一致性问题。

一、概念

分布式

分布式是一种用于在分布式环境中控制对共享资源访问的分布式可以防止多个进程或线程同时访问共享资源,从而避免数据冲突和资源竞争。

事务

事务是指一组操作要么全部执行,要么全部不执行,以保证数据的一致性。事务通常用于处理多个数据源之间的操作,例如对于跨多个数据库的事务操作,需要保证在执行过程中的原子性、一致性和持久性。

区别

区别

分布式

事务

作用

控制对共享资源的访问

保证数据的一致性

范围

单个资源

多个资源

粒度

细粒度

粗粒度

实现

基于数据库、基于消息队列、基于共享内存等

基于 ACID 原理

优缺点

优点:简单易用、性能高;缺点:无法保证数据一致性

优点:保证数据一致性;缺点:实现复杂、性能低

使用场景

抢购、秒杀、数据同步等

银行转账、订单支付等

本质区别

分布式是针对资源访问的

事务是针对数据一致性的

二、使用场景

分布式

分布式通常用于以下场景:

  • 抢购、秒杀:在抢购、秒杀等场景中,需要防止多个用户同时下单,从而保证公平性。
  • 数据同步:在数据同步场景中,需要防止多个服务器同时更新数据,从而保证数据的一致性。
  • 资源访问控制:在资源访问控制场景中,需要防止多个用户同时访问共享资源,从而保证资源的安全性。

事务

事务通常用于以下场景:

  • 银行转账:在银行转账场景中,需要保证转账金额的正确性,从而避免资金损失。
  • 订单支付:在订单支付场景中,需要保证订单的状态正确,从而避免订单丢失。
  • 数据库操作:在数据库操作场景中,需要保证数据的完整性和一致性。

三、本质区别

分布式可以防止多个进程或线程同时访问共享资源,从而避免数据冲突和资源竞争。事务可以保证数据在操作过程中的一致性,即使在发生异常的情况下,也不会导致数据不一致。

在实际应用中,可以根据具体的需求选择合适的方案。如果需要保证数据的一致性,可以使用事务。如果只需要防止资源竞争,可以使用分布式

四、事务实现

1、方案

分布式的实现方法有很多,常见的有以下几种:

Redisson 是一个基于 Redis 的 Java 分布式框架。Redisson 提供了丰富的功能,包括分布式分布式集合、分布式队列等。

以下是使用 Redisson 实现分布式的示例:

    @Autowired
    private RedissonClient redissonClient;

    public String lock() {
        // 获取
        RLock lock = redissonClient.getLock("lock");
        boolean acquired = lock.tryLock(10,-1,TimeUnit.SECONDS);
        if (acquired) {
            // 获取成功,执行业务逻辑
            return "获取成功,执行业务逻辑...";
        } else {
            // 获取失败,重试
            return "获取失败,重试...";
        }
    }

    public String unlock() {
        // 释放
        RLock lock = redissonClient.getLock("lock");
        lock.unlock();
        return "释放成功...";
    }

另外,redisson支持续期。即在键值过期后任务还没执行完成,此时需要把键值的时间自动延长。

Redisson提供了的续期机制,只要客户端加成功,就会启动一个Watch Dog。可以看到源代码的实现leaseTime不设置为-1时开启监听。如果任务没完成就调用scheduleExpirationRenewal续期方法。

tryLock() 方法用于尝试获取分布式,该方法有三个参数:

  • key:的键值
  • waitTime:等待获取的时间,单位为毫秒
  • leaseTime:的过期时间,单位为毫秒

waitTime 参数表示客户端最多等待多长时间来获取。如果在 waitTime 时间内没有获取到,则会返回 false。

leaseTime 参数表示的过期时间。如果在 leaseTime 时间内没有被释放,则会自动释放。如果 leaseTime 设置为 -1,则表示的过期时间由 renew() 方法来控制。这样,在业务逻辑执行过程中,可以定期调用 lock.renew() 方法来续期的过期时间。

tryLock() 方法的返回值是一个 Boolean 值,表示是否成功获取到。如果成功获取到,则返回 true。否则,返回 false。

2、事务方案

以下是一些常见的分布式事务解决方案:

  1. 两阶段提交(2PC)

2PC是一种经典的分布式事务解决方案,它将分布式事务分为两个阶段:准备阶段和提交阶段。在准备阶段,协调者向所有参与者发送预提交请求;如果所有参与者都同意预提交,则进入提交阶段;否则,所有参与者都将回滚事务。2PC的优点是可以保证原子性、一致性和隔离性,但是实现复杂度较高。

  1. 三阶段提交(3PC)

3PC是在2PC的基础上发展而来的一种改进方案,它引入了超时机制和预提交响应等新特性。在3PC中,协调者会向所有参与者发送预提交请求,并等待参与者的响应。如果所有参与者都同意预提交,则进入预提交阶段;否则,进入回滚阶段。在正式提交阶段,如果所有参与者都同意提交事务,则进入正式提交阶段;否则,所有参与者都将回滚事务。3PC的优点是可以更好地处理节点故障等问题,但是实现复杂度仍然较高。

  1. TCC(Try-Confirm-Cancel)

TCC是一种基于补偿机制的分布式事务解决方案。它将分布式事务分为三个阶段:尝试阶段、确认阶段和取消阶段。在尝试阶段,参与者尝试预留所需的资源,并执行一些检查和准备工作,以确保执行事务操作的前提条件满足;在确认阶段,如果所有参与者都满足,则所有参与者执行之前在Try阶段所预留的操作,并提交实际的数据持久化。在取消阶段,如果有任何一个参与者执行失败,则执行回滚操作,将系统状态恢复到事务开始之前的状态。TCC的优点是可以避免阻塞情况的发生,但是实现复杂度较高。

  1. Saga模式

Saga模式是一种基于事件驱动的分布式事务解决方案。它将分布式事务看作一系列的事件序列,每个事件都有一个唯一的ID和一个时间戳。在每个事件发生时,参与者会根据事件的内容执行相应的本地事务。如果某个参与者执行失败,则会记录该事件的状态为“已失败”,并等待其他参与者的响应。当所有的事件都被处理完毕后,再执行最终的本地事务。Saga模式的优点是可以支持复杂的业务逻辑和异常情况处理,但是实现复杂度较高。

  1. 消息队列

消息队列可以用于异步地处理多个任务,并且可以保证任务的顺序执行。在分布式系统中使用消息队列来处理事务时,可以将事务拆分成多个小任务,并将这些任务发布到消息队列中进行异步处理。当所有任务都完成后,再执行最终的本地事务。这种方式可以避免阻塞情况的发生,并且可以提高系统的可扩展性和容错能力。能保证事务的最终一致性。

  1. 最大努力通知(Best Effort Delivery)

这种解决方案通过异步通信和消息重试来实现事务的最终一致性。事务操作被封装为消息发送到目标系统,如果消息传递失败,系统会进行重试。

  1. 分布式事务中间件

Seata是一款阿里巴巴开源的分布式事务中间件,它提供了AT、TCC、SAGA和XA事务模式,为用户打造一站式的分布式解决方案。Seata的设计思路是将一个分布式事务理解成全局事务,下面挂了若干个分支事务,而一个分支事务就是一个满足ACID的本地事务,因此我们可以操作分布式事务像操作本地事务一样简单。


http://www.niftyadmin.cn/n/5096346.html

相关文章

2023年中国半导体缺陷检测设备市场规模及发展趋势分析[图]

前道检测设备帮助晶圆厂在更快时间内提升芯片良率,按功能可分为参数量测、缺陷检测。前道检测设备按功能可分为参数量测、缺陷检测。 半导体缺陷检测设备分类 资料来源:共研产业咨询(共研网) 2023-2029年中国半导体缺陷检测设备行…

docker ---rabbitmq 安装

第一步:安装rabbitmq sudo docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.9-management第二步:安装延迟队列插件(因为使用了延迟队列) 1、将插件 放入 /plugins/ 目录下(需要先将插件文件放入宿主…

insert select写法报错Incorrect integer value的坑

一、问题 最近项目的mysql数据库迁移到了oceanbase数据库,同样的sql,mysql可以执行,但是oceanbase里执行就报错: [Err] 1366 - Incorrect integer value错误sql样例如下: INSERT into student_sign_statistics SEL…

ChatGPT教你5分钟解锁国际象棋技能

国际象棋是一种很好玩的棋类游戏,走法和规则与中国象棋有所区别。如果想要快速入门,可以把ChatGPT当做私人教练,提出这些问题: ●作为零基础的初学者,学习国际象棋的最佳方法是什么?如何快速入门&#xff…

Jmeter关联操作

1.首先右键添加一个线程选择线程组,命名为线程组-1,添加取样器选择HTTP请求--城市天气 2.线程组-1右键,添加取样器选择后置处理器中的JSON提取器 3.线程组-1右键,添加取样器选择后置处理器中的BeanShell 后置处理程序(必须平级) 4.首先右键添加一个线程选…

(八)Python类和对象

Python 语言在设计之初,就定位为一门面向对象的编程语言,“Python 中一切皆对象”就是对 Python 这门编程语言的完美诠释。 类和对象是 Python 的重要特征,相比其它面向对象语言,Python 很容易就可以创建出一个类和对象。同时&am…

亚马逊、eBay,速卖通,国际站买家账号支付异常问题解决方法

如何解决下单被砍、封号问题,建议采取以下措施: 买家账号下单,不单纯只是解决支付卡、IP问题就可以了,因为平台大数据风控点很多, 我们防关联具体要解决几个问题 一:要硬件参数的关联、安全码、地区码、…

LXC、Docker、 Kubernetes 容器以及Hypervisor的区别

LXC、Docker、 Kubernetes 容器以及Hypervisor的区别 SaaS: Software-as-a-Service(软件即服务) PaaS: Platform-as-a-Service(平台即服务) IaaS: Infrastructure-as-a-Service(基础设施即服务) 1、Docke…