国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

PostgreSQL-分布式事務(wù)之兩階段提交

這篇具有很好參考價值的文章主要介紹了PostgreSQL-分布式事務(wù)之兩階段提交。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

什么是ACID

在日常操作中,對于一組相關(guān)操作,通常需要其全部成功或全部失敗。

在關(guān)系型數(shù)據(jù)庫中,將這組相關(guān)操作稱為“事務(wù)”。

在一個事務(wù)中,多個插入、修改、刪除操作要么全部成功,要么全部失敗,這稱為“原子性”,實(shí)際上一個事務(wù)還需要有其他三個特性,即“一致性”“隔離性”“持久性”,英文簡稱為“ACID”:

  • 原子性(Atomicity):事務(wù)必須以一個整體單元的形式進(jìn)行工作,對于其數(shù)據(jù)的修改,要么全部執(zhí)行,要么全都不執(zhí)行。如果只執(zhí)行事務(wù)中多個操作的前半部分就出現(xiàn)錯誤,那么必須回滾所有的操作,讓數(shù)據(jù)在邏輯上回滾到原先的狀態(tài)
  • 一致性(Consistency):在事務(wù)完成時,必須使所有的數(shù)據(jù)都保持在一致狀態(tài)。(AB轉(zhuǎn)賬,A賬戶5000元,不論他怎么轉(zhuǎn)給B,AB賬戶合計(jì)還是5000元,這就是一致性)
  • 隔離性(Isolation):事務(wù)查看數(shù)據(jù)時數(shù)據(jù)所處的狀態(tài),要么是另一并發(fā)事務(wù)修改它之前的狀態(tài),要么是另一事務(wù)修改它之后的狀態(tài),事務(wù)是不會查看中間狀態(tài)的數(shù)據(jù)的
  • 持久性(Durability):事務(wù)完成之后,它對于系統(tǒng)的影響是永久性的,即使今后出現(xiàn)致命的系統(tǒng)故障(如機(jī)器重啟、斷電),數(shù)據(jù)也將一直保持

在PG中,可以使用多版本并發(fā)控制(MVCC)來維護(hù)數(shù)據(jù)的一致性。相比于鎖定模型,其主要優(yōu)點(diǎn)是在MVCC下對檢索(讀)數(shù)據(jù)的鎖請求與寫數(shù)據(jù)的鎖請求不沖突,讀不會阻塞寫,而寫也不會阻塞讀

在PG中提供了表和行級別的鎖定語句,讓應(yīng)用能更方便地操作并發(fā)數(shù)據(jù)。

DDL事務(wù)

在PG中,與其他數(shù)據(jù)庫最大的不同是,大多數(shù)DDL也是可以包含在一個事務(wù)中的,而且也是可以回滾的。該功能非常適合把PG作為Sharding的分布式數(shù)據(jù)系統(tǒng)的底層數(shù)據(jù)庫。

比如在Sharding中常常需要在多個節(jié)點(diǎn)中建相同的表,此時可以考慮把建表語句放在同一個事務(wù)中,這樣就可以在各個節(jié)點(diǎn)上先啟動一個事務(wù),然后再執(zhí)行建表語句,如果某個節(jié)點(diǎn)執(zhí)行失敗,也可以回滾前面已執(zhí)行建表成功的操作,自然就不會出現(xiàn)部分節(jié)點(diǎn)建表成功,部分節(jié)點(diǎn)建表失敗的情況。

事務(wù)的使用方法

手動設(shè)置

set AUTOCOMMIT off

PostgreSQL-分布式事務(wù)之兩階段提交

BEGIN語句

PostgreSQL-分布式事務(wù)之兩階段提交

SAVEPOINT

PG支持保存點(diǎn)(SAVEPOINT)的功能,在一個大事務(wù)中,可以把操作過程分為幾個部分,第一個部分執(zhí)行成功后可以建一個保存點(diǎn),若后面的部分執(zhí)行失敗,則回滾到此保存點(diǎn),而不必回滾整個事務(wù)。

PostgreSQL-分布式事務(wù)之兩階段提交

事務(wù)隔離級別

數(shù)據(jù)庫的事務(wù)隔離級別有以下4種(不同的數(shù)據(jù)庫可能不同):

  • READ UNCOMMITTED:讀未提交
  • READ COMMITTED:讀已提交
  • REPEATABLE READ:重復(fù)讀
  • SERIALIZABLE:串行化

對于并發(fā)事務(wù),我們不希望發(fā)生不一致的情況,這類情況的級別從高到低排序如下:

  • 臟讀:一個事務(wù)讀取了另一個未提交事務(wù)寫入的數(shù)據(jù)。這是我們最不希望發(fā)生的,因?yàn)槿绻l(fā)生了臟讀,則在并發(fā)控制上,應(yīng)用程序會變得很復(fù)雜
  • 不可重復(fù)讀:指一個事務(wù)重新讀取前面讀取過的數(shù)據(jù)時,發(fā)現(xiàn)該數(shù)據(jù)已經(jīng)被另一個已提交事務(wù)修改了。在大多數(shù)情況下,這還是可以接受的,只是在少數(shù)情況下會出現(xiàn)問題
  • 幻讀:一個事務(wù)開始后,需要根據(jù)數(shù)據(jù)庫中現(xiàn)有的數(shù)據(jù)做一些更新,于是重新執(zhí)行一個查詢,返回一套符合查詢條件的行,這時發(fā)現(xiàn)這些行因?yàn)槠渌罱峤坏氖聞?wù)而發(fā)生了改變,此時現(xiàn)有的事務(wù)如果再進(jìn)行下去的話,就可能會導(dǎo)致數(shù)據(jù)在邏輯上的一些錯誤。

不同事務(wù)隔離級別下的行為:

  1. 讀未提交:臟讀、不可重復(fù)讀、幻讀
  2. 讀已提交:不可重復(fù)讀、幻讀
  3. 重復(fù)讀:幻讀
  4. 可串行化:不會發(fā)生以上行為

對幻讀理解不清楚的,可以參考以下實(shí)例

幻讀實(shí)例

數(shù)據(jù)準(zhǔn)備

PostgreSQL-分布式事務(wù)之兩階段提交

開啟事務(wù)更新數(shù)據(jù)

PostgreSQL-分布式事務(wù)之兩階段提交
更新操作執(zhí)行完之后,新開啟一個事務(wù)插入一條數(shù)據(jù)
PostgreSQL-分布式事務(wù)之兩階段提交

更新操作事務(wù)提交后,發(fā)現(xiàn)有一條數(shù)據(jù)id=4未更新,像產(chǎn)生了幻覺一樣,這就是幻讀

PG事務(wù)隔離級別

  • 9.1版本之前只有讀已提交和可串行化
  • 9.1版本之后增加了重復(fù)讀

也就是說在PG中,如果你選擇了讀未提交的級別,實(shí)際上還是讀已提交;如果選擇可重復(fù)讀級別,有可能實(shí)際上仍是可串行化。

PG中默認(rèn)的隔離級別是讀已提交。當(dāng)一個事務(wù)運(yùn)行于這個隔離級別時,執(zhí)行SELECT查詢(沒有FOR UPDATE/SHARE子句)只能看到查詢開始之前已提交的數(shù)據(jù),而無法看到未提交或者查詢期間其他事務(wù)已提交的數(shù)據(jù);可以看到自身所在事務(wù)前面尚未提交的更新結(jié)果。實(shí)際上,SELECT查詢看到的是查詢開始運(yùn)行瞬間的一個快照。

注意:同一個事務(wù)中兩個相鄰的SELECT命令可能看到不同的快照,因?yàn)榭赡苡衅渌聞?wù)在第一個SELECT執(zhí)行完之后,提交了更新結(jié)果。

兩階段提交

PG數(shù)據(jù)庫支持兩階段提交協(xié)議。

在分布式系統(tǒng)中,事務(wù)中往往包含了多臺數(shù)據(jù)庫上的操作,雖然單臺數(shù)據(jù)庫的操作能夠保證原子性,但多臺數(shù)據(jù)庫之間的原子性就需要通過兩階段提交來實(shí)現(xiàn)了,兩階段提交是實(shí)現(xiàn)分布式事務(wù)的關(guān)鍵。

兩階段提交有如下5個步驟:

  1. 應(yīng)用程序先調(diào)用各臺數(shù)據(jù)庫做一些操作,但不提交事務(wù)。然后應(yīng)用程序調(diào)用事務(wù)協(xié)調(diào)器(該協(xié)調(diào)器可能也是由應(yīng)用自己實(shí)現(xiàn)的)中的提交方法
  2. 事務(wù)協(xié)調(diào)器將聯(lián)絡(luò)事務(wù)中涉及的每臺數(shù)據(jù)庫,并通知它們準(zhǔn)備提交事務(wù),這是第一階段的開始。PG中一般是調(diào)用PREPARE TRANSACTION命令
  3. 各臺數(shù)據(jù)庫接收到PREPARE TRANSACTION命令后,如果要返回成功,則數(shù)據(jù)庫必須將自己置于如下狀態(tài):確保后續(xù)能在被要求提交(回滾)事務(wù)的時候提交(回滾)事務(wù),所以PG會將已準(zhǔn)備好提交的信息寫入持久存儲區(qū)中。如果數(shù)據(jù)庫無法完成此事務(wù),它會直接返回失敗給事務(wù)協(xié)調(diào)器
  4. 事務(wù)協(xié)調(diào)器接收所有數(shù)據(jù)庫的響應(yīng)
  5. 在第二階段,如果任何一個數(shù)據(jù)庫在第一階段返回失敗,則事務(wù)協(xié)調(diào)器將會發(fā)一個回滾命令ROLLBACK PREPARED給各臺數(shù)據(jù)庫。如果所有數(shù)據(jù)庫的響應(yīng)都是成功的,則向各臺數(shù)據(jù)庫發(fā)送COMMIT PREPARED命令,通知各臺數(shù)據(jù)庫事務(wù)成功

兩階段提交實(shí)例

配置max_prepared_transactions

PostgreSQL-分布式事務(wù)之兩階段提交
PostgreSQL-分布式事務(wù)之兩階段提交

重啟服務(wù)

PostgreSQL-分布式事務(wù)之兩階段提交

二階段提交

PostgreSQL-分布式事務(wù)之兩階段提交

  • 第一階段:PREPARE TRANSACTION ‘osdba_global_trans_0001’
  • 第二階段:COMMIT PREPARED ‘osdba_global_trans_0001’

注意:第一階段結(jié)束后,重啟服務(wù),模擬數(shù)據(jù)庫宕機(jī)。服務(wù)重啟后,第二階段提交,數(shù)據(jù)可以正常查詢。

上述命令osdba_global_trans_0001是兩階段提交中全局事務(wù)的ID,由事務(wù)協(xié)調(diào)器生成(事務(wù)協(xié)調(diào)器會持久化該ID)。PG數(shù)據(jù)庫一旦成功執(zhí)行這條命令,也會把事務(wù)持久化,即使數(shù)據(jù)庫重啟,此事務(wù)也不會回滾或丟失文章來源地址http://www.zghlxwxcb.cn/news/detail-443308.html

到了這里,關(guān)于PostgreSQL-分布式事務(wù)之兩階段提交的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【分布式事務(wù)】Seata 開源的分布式事務(wù)解決方案

    【分布式事務(wù)】Seata 開源的分布式事務(wù)解決方案

    Seata 是一款開源的分布式事務(wù)解決方案,致力于提供高性能和簡單易用的分布式事務(wù)服務(wù)。Seata 將為用戶提供了 AT、TCC、SAGA 和 XA 事務(wù)模式,為用戶打造一站式的分布式解決方案。 阿里巴巴作為國內(nèi)最早一批進(jìn)行應(yīng)用分布式(微服務(wù)化)改造的企業(yè),很早就遇到微服務(wù)架構(gòu)下

    2024年02月02日
    瀏覽(17)
  • 【分布式】分布式事務(wù):2PC

    【分布式】分布式事務(wù):2PC

    分布式事務(wù)的問題可以分為兩部分: 并發(fā)控制 concurrency control 原子提交 atomic commit 分布式事務(wù)問題的產(chǎn)生場景:一份數(shù)據(jù)被分片存在多臺服務(wù)器上,那么每次事務(wù)處理都涉及到了多臺機(jī)器。 可序列化(并發(fā)控制): 定義了事務(wù)執(zhí)行的正確性 真正地并行執(zhí)行事務(wù),獲得真正的

    2024年02月09日
    瀏覽(19)
  • Redis分布式鎖和分布式事務(wù)

    Redis分布式鎖和分布式事務(wù) 一、Redis分布式鎖 1.1 watch和事務(wù)實(shí)現(xiàn)分布式鎖 原理是通過watch來觀察一個變量,一個線程在操作的時候,其他線程會操作失敗,相當(dāng)于樂觀鎖。 1.2 setnx實(shí)現(xiàn)分布式鎖 原理是通過setnx設(shè)置一個變量,設(shè)置成功的線程搶到鎖,執(zhí)行相關(guān)的業(yè)務(wù),執(zhí)行完畢

    2024年02月09日
    瀏覽(25)
  • 分布式軟件架構(gòu)——分布式事務(wù)TCC和SAGA

    分布式軟件架構(gòu)——分布式事務(wù)TCC和SAGA

    TCC 是另一種常見的分布式事務(wù)機(jī)制,它是“ Try-Confirm-Cancel ”三個單詞的縮寫,是由數(shù)據(jù)庫專家 Pat Helland 在 2007 年撰寫的論文《Life beyond Distributed Transactions: An Apostate’s Opinion》中提出。 前面介紹的可靠消息隊(duì)列雖然能保證最終的結(jié)果是相對可靠的,過程也足夠簡單(相對于

    2024年02月12日
    瀏覽(23)
  • 【分布式】java實(shí)現(xiàn)分布式事務(wù)的五種方案

    【分布式】java實(shí)現(xiàn)分布式事務(wù)的五種方案

    用戶支付完成會將支付狀態(tài)及訂單狀態(tài)保存在訂單數(shù)據(jù)庫中,由訂單服務(wù)去維護(hù)訂單數(shù)據(jù)庫。由庫存服務(wù)去維護(hù)庫存數(shù)據(jù)庫的信息。下圖是系統(tǒng)結(jié)構(gòu)圖: 如何實(shí)現(xiàn)兩個分布式服務(wù)(訂單服務(wù)、庫存服務(wù))共同完成一件事即訂單支付成功自動減庫存,這里的關(guān)鍵是如何保證兩個

    2024年04月11日
    瀏覽(20)
  • 微服務(wù)·數(shù)據(jù)一致-事務(wù)與分布式事務(wù)

    微服務(wù)·數(shù)據(jù)一致-事務(wù)與分布式事務(wù)

    事務(wù)是計(jì)算機(jī)科學(xué)和數(shù)據(jù)庫管理中的一個關(guān)鍵概念,用于確保數(shù)據(jù)的一致性和可靠想。事務(wù)管理是大多數(shù)應(yīng)用程序和數(shù)據(jù)庫系統(tǒng)中不可或缺的一部分。分布式事務(wù)擴(kuò)展了事務(wù)的概念,用于多個分布式系統(tǒng)和服務(wù)的數(shù)據(jù)一致性管理。本調(diào)查報(bào)告將深入探討事務(wù)和分布式事務(wù)的概

    2024年02月09日
    瀏覽(20)
  • Flink實(shí)戰(zhàn)(11)-Exactly-Once語義之兩階段提交

    Flink實(shí)戰(zhàn)(11)-Exactly-Once語義之兩階段提交

    [Apache Flink]2017年12月發(fā)布的1.4.0版本開始,為流計(jì)算引入里程碑特性:TwoPhaseCommitSinkFunction。它提取了兩階段提交協(xié)議的通用邏輯,使得通過Flink來構(gòu)建端到端的Exactly-Once程序成為可能。同時支持: 數(shù)據(jù)源(source) 和輸出端(sink) 包括Apache Kafka 0.11及更高版本。它提供抽象層

    2024年02月05日
    瀏覽(14)
  • 【高級篇】分布式事務(wù)

    【高級篇】分布式事務(wù)

    本地事務(wù),也就是傳統(tǒng)的 單機(jī)事務(wù) 。在傳統(tǒng)數(shù)據(jù)庫事務(wù)中,必須要滿足四個原則: 分布式事務(wù) ,就是指不是在單個服務(wù)或單個數(shù)據(jù)庫架構(gòu)下,產(chǎn)生的事務(wù),例如: 跨數(shù)據(jù)源的分布式事務(wù) 跨服務(wù)的分布式事務(wù) 綜合情況 在數(shù)據(jù)庫水平拆分、服務(wù)垂直拆分之后,一個業(yè)務(wù)操作

    2024年02月08日
    瀏覽(17)
  • Springboot分布式事務(wù)

    Springboot分布式事務(wù)

    1. 概念 本地事務(wù)是指事務(wù)的參與者、支持事務(wù)的服務(wù)器、資源服務(wù)器以及事務(wù)管理器位于同一節(jié)點(diǎn)相同數(shù)據(jù)庫上。 又稱為傳統(tǒng)事務(wù)。它是一個操作序列,這些操作要么都執(zhí)行,要么都不執(zhí)行,是一個不可分割的工作單位。例如,銀行轉(zhuǎn)賬工作:從一個帳號扣款并使另一個帳

    2024年02月09日
    瀏覽(24)
  • 分布式事務(wù) Seata

    分布式事務(wù) Seata

    事務(wù)(Transaction)是計(jì)算機(jī)科學(xué)中的一個重要概念,主要是指一個 完整的、不可分割的操作序列 。在關(guān)系型數(shù)據(jù)庫中,事務(wù)通常用于描述對數(shù)據(jù)庫進(jìn)行的一系列操作的執(zhí)行單元。 事務(wù)的ACID特性 : 原子性(Atomicity):事務(wù)是一個原子操作,要么全部執(zhí)行,要么全部回滾。如

    2024年02月17日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包