自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

事務(wù)管理 vs. 鎖控制:你真的分得清嗎?

開(kāi)發(fā) 后端
分布式鎖和事務(wù)是分布式系統(tǒng)中兩個(gè)重要的概念,它們都用于解決分布式環(huán)境下的數(shù)據(jù)一致性問(wèn)題。

分布式鎖和事務(wù)是分布式系統(tǒng)中兩個(gè)重要的概念,它們都用于解決分布式環(huán)境下的數(shù)據(jù)一致性問(wèn)題。

一、概念

分布式鎖

分布式鎖是一種用于在分布式環(huán)境中控制對(duì)共享資源訪問(wèn)的鎖。分布式鎖可以防止多個(gè)進(jìn)程或線程同時(shí)訪問(wèn)共享資源,從而避免數(shù)據(jù)沖突和資源競(jìng)爭(zhēng)。

事務(wù)

事務(wù)是指一組操作要么全部執(zhí)行,要么全部不執(zhí)行,以保證數(shù)據(jù)的一致性。事務(wù)通常用于處理多個(gè)數(shù)據(jù)源之間的操作,例如對(duì)于跨多個(gè)數(shù)據(jù)庫(kù)的事務(wù)操作,需要保證在執(zhí)行過(guò)程中的原子性、一致性和持久性。

區(qū)別

區(qū)別

分布式鎖

事務(wù)

作用

控制對(duì)共享資源的訪問(wèn)

保證數(shù)據(jù)的一致性

范圍

單個(gè)資源

多個(gè)資源

粒度

細(xì)粒度

粗粒度

實(shí)現(xiàn)

基于數(shù)據(jù)庫(kù)、基于消息隊(duì)列、基于共享內(nèi)存等

基于 ACID 原理

優(yōu)缺點(diǎn)

優(yōu)點(diǎn):簡(jiǎn)單易用、性能高;缺點(diǎn):無(wú)法保證數(shù)據(jù)一致性

優(yōu)點(diǎn):保證數(shù)據(jù)一致性;缺點(diǎn):實(shí)現(xiàn)復(fù)雜、性能低

使用場(chǎng)景

搶購(gòu)、秒殺、數(shù)據(jù)同步等

銀行轉(zhuǎn)賬、訂單支付等

本質(zhì)區(qū)別

分布式鎖是針對(duì)資源訪問(wèn)的

事務(wù)是針對(duì)數(shù)據(jù)一致性的

二、使用場(chǎng)景

分布式鎖

分布式鎖通常用于以下場(chǎng)景:

  • 搶購(gòu)、秒殺:在搶購(gòu)、秒殺等場(chǎng)景中,需要防止多個(gè)用戶同時(shí)下單,從而保證公平性。
  • 數(shù)據(jù)同步:在數(shù)據(jù)同步場(chǎng)景中,需要防止多個(gè)服務(wù)器同時(shí)更新數(shù)據(jù),從而保證數(shù)據(jù)的一致性。
  • 資源訪問(wèn)控制:在資源訪問(wèn)控制場(chǎng)景中,需要防止多個(gè)用戶同時(shí)訪問(wèn)共享資源,從而保證資源的安全性。

事務(wù)

事務(wù)通常用于以下場(chǎng)景:

  • 銀行轉(zhuǎn)賬:在銀行轉(zhuǎn)賬場(chǎng)景中,需要保證轉(zhuǎn)賬金額的正確性,從而避免資金損失。
  • 訂單支付:在訂單支付場(chǎng)景中,需要保證訂單的狀態(tài)正確,從而避免訂單丟失。
  • 數(shù)據(jù)庫(kù)操作:在數(shù)據(jù)庫(kù)操作場(chǎng)景中,需要保證數(shù)據(jù)的完整性和一致性。

三、本質(zhì)區(qū)別

分布式鎖可以防止多個(gè)進(jìn)程或線程同時(shí)訪問(wèn)共享資源,從而避免數(shù)據(jù)沖突和資源競(jìng)爭(zhēng)。事務(wù)可以保證數(shù)據(jù)在操作過(guò)程中的一致性,即使在發(fā)生異常的情況下,也不會(huì)導(dǎo)致數(shù)據(jù)不一致。

在實(shí)際應(yīng)用中,可以根據(jù)具體的需求選擇合適的方案。如果需要保證數(shù)據(jù)的一致性,可以使用事務(wù)。如果只需要防止資源競(jìng)爭(zhēng),可以使用分布式鎖。

四、鎖與事務(wù)實(shí)現(xiàn)

1、鎖方案

分布式鎖的實(shí)現(xiàn)方法有很多,常見(jiàn)的有以下幾種:

  • 數(shù)據(jù)庫(kù)鎖:使用數(shù)據(jù)庫(kù)中的行鎖或表鎖來(lái)實(shí)現(xiàn)分布式鎖。
  • 文件鎖:使用文件來(lái)實(shí)現(xiàn)分布式鎖。
  • Zookeeper鎖:使用Zookeeper來(lái)實(shí)現(xiàn)分布式鎖。
  • Redis鎖:使用Redis來(lái)實(shí)現(xiàn)分布式鎖。
  • 消息隊(duì)列鎖:使用消息隊(duì)列來(lái)實(shí)現(xiàn)分布式鎖。

Redisson 是一個(gè)基于 Redis 的 Java 分布式框架。Redisson 提供了豐富的功能,包括分布式鎖、分布式集合、分布式隊(duì)列等。

以下是使用 Redisson 實(shí)現(xiàn)分布式鎖的示例:

@Autowired
    private RedissonClient redissonClient;

    public String lock() {
        // 獲取鎖
        RLock lock = redissonClient.getLock("lock");
        boolean acquired = lock.tryLock(10,-1,TimeUnit.SECONDS);
        if (acquired) {
            // 獲取鎖成功,執(zhí)行業(yè)務(wù)邏輯
            return "獲取鎖成功,執(zhí)行業(yè)務(wù)邏輯...";
        } else {
            // 獲取鎖失敗,重試
            return "獲取鎖失敗,重試...";
        }
    }

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

另外,redisson支持鎖續(xù)期。即在鎖鍵值過(guò)期后任務(wù)還沒(méi)執(zhí)行完成,此時(shí)需要把鎖鍵值的時(shí)間自動(dòng)延長(zhǎng)。

Redisson提供了的續(xù)期機(jī)制,只要客戶端加鎖成功,就會(huì)啟動(dòng)一個(gè)Watch Dog??梢钥吹皆创a的實(shí)現(xiàn)leaseTime不設(shè)置為-1時(shí)開(kāi)啟監(jiān)聽(tīng)。如果任務(wù)沒(méi)完成就調(diào)用scheduleExpirationRenewal續(xù)期方法。

tryLock() 方法用于嘗試獲取分布式鎖,該方法有三個(gè)參數(shù):

  • key:鎖的鍵值。
  • waitTime:等待獲取鎖的時(shí)間,單位為毫秒。
  • leaseTime:鎖的過(guò)期時(shí)間,單位為毫秒。

waitTime 參數(shù)表示客戶端最多等待多長(zhǎng)時(shí)間來(lái)獲取鎖。如果在 waitTime 時(shí)間內(nèi)沒(méi)有獲取到鎖,則會(huì)返回 false。

leaseTime 參數(shù)表示鎖的過(guò)期時(shí)間。如果鎖在 leaseTime 時(shí)間內(nèi)沒(méi)有被釋放,則會(huì)自動(dòng)釋放。如果 leaseTime 設(shè)置為 -1,則表示鎖的過(guò)期時(shí)間由 renew() 方法來(lái)控制。這樣,在業(yè)務(wù)邏輯執(zhí)行過(guò)程中,可以定期調(diào)用 lock.renew() 方法來(lái)續(xù)期鎖的過(guò)期時(shí)間。

tryLock() 方法的返回值是一個(gè) Boolean 值,表示是否成功獲取到鎖。如果成功獲取到鎖,則返回 true。否則,返回 false。

2、事務(wù)方案

以下是一些常見(jiàn)的分布式事務(wù)解決方案:

兩階段提交(2PC)

2PC是一種經(jīng)典的分布式事務(wù)解決方案,它將分布式事務(wù)分為兩個(gè)階段:準(zhǔn)備階段和提交階段。在準(zhǔn)備階段,協(xié)調(diào)者向所有參與者發(fā)送預(yù)提交請(qǐng)求;如果所有參與者都同意預(yù)提交,則進(jìn)入提交階段;否則,所有參與者都將回滾事務(wù)。2PC的優(yōu)點(diǎn)是可以保證原子性、一致性和隔離性,但是實(shí)現(xiàn)復(fù)雜度較高。

三階段提交(3PC)

3PC是在2PC的基礎(chǔ)上發(fā)展而來(lái)的一種改進(jìn)方案,它引入了超時(shí)機(jī)制和預(yù)提交響應(yīng)等新特性。在3PC中,協(xié)調(diào)者會(huì)向所有參與者發(fā)送預(yù)提交請(qǐng)求,并等待參與者的響應(yīng)。如果所有參與者都同意預(yù)提交,則進(jìn)入預(yù)提交階段;否則,進(jìn)入回滾階段。在正式提交階段,如果所有參與者都同意提交事務(wù),則進(jìn)入正式提交階段;否則,所有參與者都將回滾事務(wù)。3PC的優(yōu)點(diǎn)是可以更好地處理節(jié)點(diǎn)故障等問(wèn)題,但是實(shí)現(xiàn)復(fù)雜度仍然較高。

TCC(Try-Confirm-Cancel)

TCC是一種基于補(bǔ)償機(jī)制的分布式事務(wù)解決方案。它將分布式事務(wù)分為三個(gè)階段:嘗試階段、確認(rèn)階段和取消階段。在嘗試階段,參與者嘗試預(yù)留所需的資源,并執(zhí)行一些檢查和準(zhǔn)備工作,以確保執(zhí)行事務(wù)操作的前提條件滿足;在確認(rèn)階段,如果所有參與者都滿足,則所有參與者執(zhí)行之前在Try階段所預(yù)留的操作,并提交實(shí)際的數(shù)據(jù)持久化。在取消階段,如果有任何一個(gè)參與者執(zhí)行失敗,則執(zhí)行回滾操作,將系統(tǒng)狀態(tài)恢復(fù)到事務(wù)開(kāi)始之前的狀態(tài)。TCC的優(yōu)點(diǎn)是可以避免阻塞情況的發(fā)生,但是實(shí)現(xiàn)復(fù)雜度較高。

Saga模式

Saga模式是一種基于事件驅(qū)動(dòng)的分布式事務(wù)解決方案。它將分布式事務(wù)看作一系列的事件序列,每個(gè)事件都有一個(gè)唯一的ID和一個(gè)時(shí)間戳。在每個(gè)事件發(fā)生時(shí),參與者會(huì)根據(jù)事件的內(nèi)容執(zhí)行相應(yīng)的本地事務(wù)。如果某個(gè)參與者執(zhí)行失敗,則會(huì)記錄該事件的狀態(tài)為“已失敗”,并等待其他參與者的響應(yīng)。當(dāng)所有的事件都被處理完畢后,再執(zhí)行最終的本地事務(wù)。Saga模式的優(yōu)點(diǎn)是可以支持復(fù)雜的業(yè)務(wù)邏輯和異常情況處理,但是實(shí)現(xiàn)復(fù)雜度較高。

消息隊(duì)列

消息隊(duì)列可以用于異步地處理多個(gè)任務(wù),并且可以保證任務(wù)的順序執(zhí)行。在分布式系統(tǒng)中使用消息隊(duì)列來(lái)處理事務(wù)時(shí),可以將事務(wù)拆分成多個(gè)小任務(wù),并將這些任務(wù)發(fā)布到消息隊(duì)列中進(jìn)行異步處理。當(dāng)所有任務(wù)都完成后,再執(zhí)行最終的本地事務(wù)。這種方式可以避免阻塞情況的發(fā)生,并且可以提高系統(tǒng)的可擴(kuò)展性和容錯(cuò)能力。能保證事務(wù)的最終一致性。

最大努力通知(Best Effort Delivery)

這種解決方案通過(guò)異步通信和消息重試來(lái)實(shí)現(xiàn)事務(wù)的最終一致性。事務(wù)操作被封裝為消息發(fā)送到目標(biāo)系統(tǒng),如果消息傳遞失敗,系統(tǒng)會(huì)進(jìn)行重試。

分布式事務(wù)中間件

Seata是一款阿里巴巴開(kāi)源的分布式事務(wù)中間件,它提供了AT、TCC、SAGA和XA事務(wù)模式,為用戶打造一站式的分布式解決方案。Seata的設(shè)計(jì)思路是將一個(gè)分布式事務(wù)理解成全局事務(wù),下面掛了若干個(gè)分支事務(wù),而一個(gè)分支事務(wù)就是一個(gè)滿足ACID的本地事務(wù),因此我們可以操作分布式事務(wù)像操作本地事務(wù)一樣簡(jiǎn)單。

責(zé)任編輯:姜華 來(lái)源: 今日頭條
相關(guān)推薦

2018-04-19 22:57:43

無(wú)線接入網(wǎng)vRANRAN

2020-06-10 07:37:01

自由軟件開(kāi)源軟件免費(fèi)軟件

2017-12-14 20:25:32

2018-12-20 09:30:59

分布式高并發(fā)多線程

2018-11-12 13:01:45

機(jī)器學(xué)習(xí)模型元學(xué)習(xí)

2025-03-26 09:04:12

2021-11-26 08:07:16

MySQL SQL 語(yǔ)句數(shù)據(jù)庫(kù)

2025-02-08 10:56:18

2009-06-30 16:57:42

Spring事務(wù)管理

2023-10-08 08:28:10

Spring事務(wù)管理

2009-06-17 14:57:11

Spring事務(wù)管理

2022-08-04 14:54:50

APTDNFYUM

2021-01-13 16:04:07

網(wǎng)絡(luò)On-Prem托管

2014-08-25 09:12:47

Spring事務(wù)管理

2009-09-29 09:44:52

Hibernate事務(wù)

2009-09-23 17:48:00

Hibernate事務(wù)

2025-02-21 08:00:00

事務(wù)管理SpringBootJava

2009-06-08 17:56:00

SpringJDBC事務(wù)

2023-03-27 10:40:09

2009-06-03 10:20:11

Hibernate事務(wù)管理配置
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)