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

[MySQL]事務(wù)ACID詳解

這篇具有很好參考價(jià)值的文章主要介紹了[MySQL]事務(wù)ACID詳解。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

[MySQL]事務(wù)ACID詳解


[MySQL]事務(wù)ACID詳解專欄簡(jiǎn)介 :MySql數(shù)據(jù)庫(kù)從入門到進(jìn)階.

[MySQL]事務(wù)ACID詳解題目來(lái)源:leetcode,???劍指offer.

[MySQL]事務(wù)ACID詳解創(chuàng)作目標(biāo):記錄學(xué)習(xí)MySql學(xué)習(xí)歷程

[MySQL]事務(wù)ACID詳解希望在提升自己的同時(shí),幫助他人,,與大家一起共同進(jìn)步,互相成長(zhǎng).

[MySQL]事務(wù)ACID詳解學(xué)歷代表過(guò)去,能力代表現(xiàn)在,學(xué)習(xí)能力代表未來(lái)!?


目錄?

1.?事務(wù)的概念

2. 事務(wù)的特性

3.事務(wù)控制語(yǔ)法

4. 事務(wù)并發(fā)異常

5. 事務(wù)隔離級(jí)別


1.?事務(wù)的概念

事務(wù)指邏輯上的一組操作, 組成這組操作的各個(gè)單元, 除非全部正確執(zhí)行, 否則中間任何一個(gè)操作出現(xiàn)錯(cuò)誤, 都會(huì)回滾(rollback)到數(shù)據(jù)最初的安全狀態(tài), 以保證不會(huì)對(duì)系統(tǒng)數(shù)據(jù)庫(kù)造成錯(cuò)誤的改動(dòng).?


2. 事務(wù)的特性

談到事務(wù)一般都是以下四點(diǎn):

  • 1.原子性(Atomicity)

過(guò)去原子被認(rèn)為是分割的最小單位, 類比事務(wù), 事務(wù)是一個(gè)不可分割的工作單位, 事務(wù)中的操作要么全部成功要么全部失敗.

[MySQL]事務(wù)ACID詳解

?這個(gè)過(guò)程包含兩個(gè)步驟:

1.A轉(zhuǎn)給B 200元, A剩余600元

2.B收到A 200元, B剩余400元

原子性表示, 這兩個(gè)步驟不可分割, 要么全部成功要么全部失敗.


  • 2.一致性(Consistency)

事物提交前和提交后, 數(shù)據(jù)都是合法的一致性狀態(tài), 即使發(fā)生異常也不會(huì)破壞數(shù)據(jù)庫(kù)的完整性約束.(符合邏輯運(yùn)算)

假設(shè)要求事務(wù)執(zhí)行前后總有A的賬戶余額+B的賬戶余額=1000, 那么事務(wù)執(zhí)行后該完整性約束仍然滿足.因此這個(gè)事務(wù)就滿足一致性.

[MySQL]事務(wù)ACID詳解


  • 3.隔離性(isolation)

多個(gè)用戶并發(fā)(同時(shí))訪問(wèn)數(shù)據(jù)庫(kù)時(shí), 數(shù)據(jù)庫(kù)為每一個(gè)用戶都開(kāi)啟事物, 為了防止多個(gè)事物的操作數(shù)據(jù)相互干擾, 多個(gè)并發(fā)事物之間要相互隔離.隔離性通過(guò)事務(wù)的隔離級(jí)別來(lái)定義, 并用鎖機(jī)制來(lái)保證寫操作的隔離性, MVCC來(lái)保證讀操作的隔離性.

[MySQL]事務(wù)ACID詳解

?假設(shè)A只有500元, 如果沒(méi)有隔離性, 兩個(gè)事務(wù)同時(shí)進(jìn)行, 事務(wù)2可能會(huì)讀取到事務(wù)1還未提交的數(shù)據(jù).此時(shí)A就會(huì)轉(zhuǎn)出700, 這顯然是不符合邏輯的, 隔離性就是為了解決上述問(wèn)題.


  • 4.持久性(durability)

一個(gè)事物一旦被提交, 它對(duì)數(shù)據(jù)庫(kù)的改變就是永久的, 不管是斷電還是機(jī)器故障也不會(huì)對(duì)其有任何影響, 通過(guò)事務(wù)中重做日志(redo log)來(lái)保證, 事務(wù)修改之前會(huì)將變更信息預(yù)寫到 redo log中, 如果數(shù)據(jù)庫(kù)宕機(jī), 恢復(fù)后會(huì)讀取redo log中的數(shù)據(jù)恢復(fù)數(shù)據(jù).


3.事務(wù)控制語(yǔ)法

事務(wù)控制有幾個(gè)重要節(jié)點(diǎn), 分別是事務(wù)的開(kāi)啟, 提交, 回滾保存.

1.開(kāi)啟事務(wù)代表事務(wù)開(kāi)始執(zhí)行, 語(yǔ)句為:

start transaction --或者
begin

2.提交事務(wù)代表將事務(wù)所有的更新內(nèi)容都提交到磁盤的物理數(shù)據(jù)庫(kù), 語(yǔ)句為:

commit

3.如果發(fā)生異常需要回滾, 語(yǔ)句為:

rollback

Tips:事務(wù)一但提交就不能回滾, 異常在代碼執(zhí)行過(guò)程中發(fā)生異常需要執(zhí)行的是rollback而不是commit

示例:

張三向李四轉(zhuǎn)100元

--事務(wù)正常執(zhí)行, 提交.
begin; --開(kāi)啟事務(wù)
update account set money = money-100.00 where account.name = "張三";
update account set money = money+100.00 where account.name = "李四";
commit; --提交事務(wù)

--事務(wù)發(fā)生異常, 回滾.
begin; --開(kāi)啟事務(wù)
update account set money = money-100.00 where account.name = "張三";
update account set money = money+100.00 where account.name = "李四";
rollback; --事務(wù)回滾

在復(fù)雜場(chǎng)景中, 我們不需要全盤回滾, 而是分批執(zhí)行回滾到某個(gè)節(jié)點(diǎn)就好, 相當(dāng)于一個(gè)大事務(wù)低下嵌套多個(gè)子事務(wù).常用savepoint來(lái)實(shí)現(xiàn).

begin;
insert into students (id) values (1);
savepoint s1;
insert into stduents (id) values (2);
rollback to s1;--回滾到保留點(diǎn)s1, 因此1成功寫入, 2被回滾, 最終結(jié)果為1.

--釋放保留點(diǎn)
release savepoint s1;

4. 事務(wù)并發(fā)異常

實(shí)際生產(chǎn)過(guò)程中, 經(jīng)常會(huì)遇到多事務(wù)并發(fā)訪問(wèn)的情況, 如果沒(méi)有設(shè)置恰當(dāng)?shù)氖挛锔綦x級(jí)別, 就可能導(dǎo)致一些異常的情況出現(xiàn), 最常見(jiàn)的幾種異常為:臟讀(Dirty Read)?,幻讀(Phantom Read)?和不可重復(fù)讀(Unrepeatable Read).

  • 1. 臟讀

臟讀指一個(gè)事務(wù)訪問(wèn)到了另一個(gè)事務(wù)未提交的數(shù)據(jù).

示例:

1.假設(shè)張三有5000元的工資,事務(wù)將他的工資改為8000?此時(shí)事務(wù)A還未提交.

2.這時(shí)事務(wù)B讀取到張三的工資為8000元.

3.隨后事務(wù)A發(fā)生了異常, 回滾了事務(wù), 張三的工資又回滾到5000.

4.事務(wù)B讀取到的工資8000為臟數(shù)據(jù).事務(wù)B做了異常臟讀.

解決方式:

Read Committed 讀已提交, 將事務(wù)的隔離級(jí)別設(shè)置為讀已提交, 事務(wù)就不會(huì)訪問(wèn)到臟數(shù)據(jù).


  • 2. 不可重復(fù)讀

不可重復(fù)讀指一個(gè)事務(wù)多次讀取同一個(gè)數(shù)據(jù)的過(guò)程中, 數(shù)據(jù)值發(fā)生改變, 導(dǎo)致沒(méi)法讀到相同的數(shù)據(jù),多指表中同一條數(shù)據(jù) update 現(xiàn)象.

示例:

1.假設(shè)事務(wù)A程序員拿著5000塊錢工資去消費(fèi).

2.當(dāng)他準(zhǔn)備付款時(shí)事務(wù)A開(kāi)啟, 收費(fèi)系統(tǒng)檢測(cè)到他卡里有5000元.

3.就在此時(shí), 事務(wù)B程序員妻子用將5000元全部轉(zhuǎn)入她的銀行卡里, 并提交.

4.當(dāng)收費(fèi)系統(tǒng)準(zhǔn)備扣錢時(shí), 發(fā)現(xiàn)卡里已經(jīng)沒(méi)錢了.程序有就很納悶, 卡里明明是有錢的...

解決方式:

Repeatable Read 可重復(fù)讀, 當(dāng)讀取事務(wù)開(kāi)啟時(shí), 不允許進(jìn)行修改操作.?

此時(shí)當(dāng)事務(wù)A程序員開(kāi)啟付款事務(wù)時(shí), 不允許其他事務(wù)的修改操作(Update), 這時(shí)她的妻子將不能轉(zhuǎn)出金額.收費(fèi)系統(tǒng)就可以正??劭盍?

Tips:由此可以得出, 不可重復(fù)讀對(duì)應(yīng)的是修改(Update)操作, 但仍然可能發(fā)生幻讀, 幻讀對(duì)應(yīng)的是insert插入操作.


  • 3. 幻讀

幻讀指一個(gè)事務(wù)多次讀取同一個(gè)數(shù)據(jù)的過(guò)程中,? 全局?jǐn)?shù)據(jù)(表的結(jié)構(gòu))發(fā)生了改變, 仿佛產(chǎn)生了幻覺(jué), 多指表的 insert/delete 現(xiàn)象.

示例:

1.假設(shè)事務(wù)A妻子查看程序員的消費(fèi)賬單(全盤掃描), 發(fā)現(xiàn)只花了2000元.

2.此時(shí)事務(wù)B程序員花了10000元買了一臺(tái)電腦.及insert新增了一條消費(fèi)記錄并提交.

3.當(dāng)事務(wù)A妻子打印程序員消費(fèi)記錄時(shí)(妻子事務(wù)A提交).

4.發(fā)現(xiàn)花了12000似乎產(chǎn)生了幻覺(jué).

解決方式:

Serializable是最高的事物隔離級(jí)別, 在該級(jí)別下事務(wù)串行化執(zhí)行, 可以避免所有異常, 但數(shù)據(jù)庫(kù)效能低下, 一般不建議使用.


5. 事務(wù)隔離級(jí)別

雖然串行化的事物處理最安全, 但無(wú)法滿足數(shù)據(jù)庫(kù)高并發(fā)訪問(wèn)的需求, 因此不得不在可控的范圍內(nèi)降低數(shù)據(jù)庫(kù)的隔離標(biāo)準(zhǔn)來(lái)?yè)Q取事務(wù)的并發(fā)能力.

Tips:事務(wù)的隔離級(jí)別和數(shù)據(jù)庫(kù)的并發(fā)性是成反比的.隔離級(jí)別越低, 并發(fā)性越高.

數(shù)據(jù)庫(kù)有四種隔離標(biāo)準(zhǔn), 分別是:讀未提交(Read Uncommitted),??讀已提交(Read Committed), 可重復(fù)讀(Repeatable Read), 串行化(Serializable)


  • 1.讀未提交(Read Uncommitted)

允許讀取未提交的內(nèi)容, 這種級(jí)別下的查詢不會(huì)加鎖, 因此臟讀, 幻讀, 不可重復(fù)讀都有可能發(fā)生.


  • 2.讀已提交(Read Committed)

只允許讀取已提交的內(nèi)容, 這種情況下不會(huì)發(fā)生臟讀, 因?yàn)榕K數(shù)據(jù)屬于為提交的數(shù)據(jù), 但幻讀和不可重復(fù)讀依然有可能發(fā)生.


  • 3.可重復(fù)讀(Repeatable Read) MySQL的默認(rèn)隔離級(jí)別

用行級(jí)鎖來(lái)保證一個(gè)事務(wù)在相同查詢條件下兩次查詢結(jié)果一致?, 可以避免臟讀, 不可重復(fù)讀, 但無(wú)法避免幻讀.


  • 4.串行化(Serializable)

用表級(jí)鎖來(lái)保證所有事務(wù)串行化, 可以防止所有的異常情況, 但犧牲了數(shù)據(jù)庫(kù)的并發(fā)性.


四種隔離級(jí)別對(duì)上述三種異常的容忍度如下:(?表示可容忍 ?表示禁止)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-403702.html

事務(wù)隔離級(jí)別 臟讀 不可重復(fù)讀 幻讀
讀未提交 Read Uncommitted ? ? ?
讀已提交 Read Committed ? ? ?
可重復(fù)讀 Repeatable Read ? ? ?
串行化 Serializable ? ? ?

到了這里,關(guān)于[MySQL]事務(wù)ACID詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 【MySQL數(shù)據(jù)庫(kù)】事務(wù)

    【MySQL數(shù)據(jù)庫(kù)】事務(wù)

    事務(wù)是一種機(jī)制、一個(gè)操作序列,包含了一組數(shù)據(jù)庫(kù)操作命令,并且把所有的命令作為一個(gè)整體,一起向系統(tǒng)提交或撤銷操作請(qǐng)求,即這一組數(shù)據(jù)庫(kù)命令要么都執(zhí)行,要么都不執(zhí)行。 事務(wù)是一個(gè)不可分割的工作邏輯單元。在數(shù)據(jù)庫(kù)系統(tǒng)上執(zhí)行并發(fā)操作時(shí),事務(wù)是最小的控制單

    2024年02月09日
    瀏覽(22)
  • MySQL數(shù)據(jù)庫(kù)--事務(wù)

    MySQL 事務(wù)主要用于處理操作量大,復(fù)雜度高的數(shù)據(jù)。比如說(shuō),在人員管理系統(tǒng)中, 要?jiǎng)h除一個(gè)人員,即需要?jiǎng)h除人員的基本資料,又需要?jiǎng)h除和該人員相關(guān)的信息,如信箱, 文章等等。這樣,這些數(shù)據(jù)庫(kù)操作語(yǔ)句就構(gòu)成一個(gè)事務(wù)! 事務(wù)是一種機(jī)制、一個(gè)操作序列,包含了一

    2024年02月11日
    瀏覽(23)
  • mysql數(shù)據(jù)庫(kù)之事務(wù)

    mysql數(shù)據(jù)庫(kù)之事務(wù)

    總的來(lái)說(shuō),事務(wù) 就是一種機(jī)制,包含了一組操作命令,會(huì)作為一個(gè)不可分割的整體,要么都執(zhí)行,要么都不執(zhí)行 ,它保證了數(shù)據(jù)庫(kù)的安全可靠性 是一種機(jī)制、一個(gè)操作序列,包含了一組數(shù)據(jù)庫(kù)操作命令,并且把所有的命令作為一個(gè)整體一起向系統(tǒng)提交或撤銷操作請(qǐng)求,即這

    2024年02月09日
    瀏覽(21)
  • 【JavaSE專欄90】用最簡(jiǎn)單的方法,使用 JDBC 連接 MySQL 數(shù)據(jù)庫(kù)

    【JavaSE專欄90】用最簡(jiǎn)單的方法,使用 JDBC 連接 MySQL 數(shù)據(jù)庫(kù)

    作者主頁(yè) :Designer 小鄭 作者簡(jiǎn)介 :3年JAVA全棧開(kāi)發(fā)經(jīng)驗(yàn),專注JAVA技術(shù)、系統(tǒng)定制、遠(yuǎn)程指導(dǎo),致力于企業(yè)數(shù)字化轉(zhuǎn)型,CSDN學(xué)院、藍(lán)橋云課認(rèn)證講師。 主打方向 :Vue、SpringBoot、微信小程序 本文講解了如何使用 JDBC 連接 MySQL 數(shù)據(jù)庫(kù),并給出了樣例代碼。JDBC 是 Java 語(yǔ)言訪問(wèn)

    2024年02月11日
    瀏覽(25)
  • 簡(jiǎn)單認(rèn)識(shí)MySQL數(shù)據(jù)庫(kù)事務(wù)

    簡(jiǎn)單認(rèn)識(shí)MySQL數(shù)據(jù)庫(kù)事務(wù)

    MySQL 事務(wù)主要用于處理操作量大,復(fù)雜度高的數(shù)據(jù)。比如說(shuō),在戰(zhàn)艦登錄系統(tǒng)中, 要?jiǎng)h除一艘戰(zhàn)艦,即需要?jiǎng)h除戰(zhàn)艦的基本資料,又需要?jiǎng)h除和該戰(zhàn)艦相關(guān)的信息,如艦長(zhǎng), 登記船員等等。這樣,這些數(shù)據(jù)庫(kù)操作語(yǔ)句就構(gòu)成一個(gè)事務(wù)! ●事務(wù)是一種機(jī)制、一個(gè)操作序列,包

    2024年02月16日
    瀏覽(24)
  • 【MySQL數(shù)據(jù)庫(kù) | 第十五篇】事務(wù)

    【MySQL數(shù)據(jù)庫(kù) | 第十五篇】事務(wù)

    ? ? 目錄 ? ?前言: ?介紹事務(wù): ?控制事務(wù): ?事務(wù)四大特性: ?并發(fā)事務(wù)問(wèn)題: ?事務(wù)隔離級(jí)別: 總結(jié): ? 這章我們將進(jìn)入到MySQL基礎(chǔ)篇的最后一章:事務(wù),希望大家可以堅(jiān)持下去,跟著我一起走完MySQL的學(xué)習(xí)之旅。 MySQL是一種關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),支持事務(wù)管理。 事

    2024年02月08日
    瀏覽(23)
  • Go 語(yǔ)言實(shí)現(xiàn) MySQL 數(shù)據(jù)庫(kù)事務(wù)

    MySQL事務(wù)是指一組數(shù)據(jù)庫(kù)操作,它們被視為一個(gè)邏輯單元,并且要么全部成功執(zhí)行,要么全部回滾(撤銷)。事務(wù)是數(shù)據(jù)庫(kù)管理系統(tǒng)提供的一種機(jī)制,用于確保數(shù)據(jù)的一致性和完整性。 事務(wù)具有以下特性(通常由ACID原則定義): 原子性(Atomicity):事務(wù)中的所有操作要么全

    2024年02月08日
    瀏覽(21)
  • C# 從代碼入門 Mysql 數(shù)據(jù)庫(kù)事務(wù)

    C# 從代碼入門 Mysql 數(shù)據(jù)庫(kù)事務(wù)

    在業(yè)務(wù)開(kāi)發(fā)中,使用數(shù)據(jù)庫(kù)事務(wù)是必不可少的。而開(kāi)發(fā)中往往會(huì)使用各種 ORM 執(zhí)行數(shù)據(jù)庫(kù)操作,簡(jiǎn)化代碼復(fù)雜度,不過(guò),由于各種 ORM 的封裝特性,開(kāi)發(fā)者的使用方式也不一樣,開(kāi)發(fā)者想要了解 ORM 對(duì)事務(wù)做了什么處理是比較難的。因此,本文介紹數(shù)據(jù)庫(kù)事務(wù)基礎(chǔ)、Ado.net 事務(wù)

    2024年02月04日
    瀏覽(21)
  • 初識(shí)mysql數(shù)據(jù)庫(kù)之事務(wù)的概念及操作

    初識(shí)mysql數(shù)據(jù)庫(kù)之事務(wù)的概念及操作

    目錄 一、數(shù)據(jù)庫(kù)多客戶端訪問(wèn)問(wèn)題 1. 數(shù)據(jù)庫(kù)的CURD無(wú)限制帶來(lái)的問(wèn)題 2. 如何解決CURD導(dǎo)致的問(wèn)題 二、事務(wù)的概念 1. 什么是事務(wù) 2. 事務(wù)的四個(gè)屬性 3. mysql對(duì)事務(wù)的管理 4. 為什么會(huì)有事務(wù) 5. 事務(wù)的版本支持 三、事務(wù)的操作 1. 事務(wù)提交方式 2. 事務(wù)操作的準(zhǔn)備工作 2.1 數(shù)據(jù)庫(kù)是網(wǎng)

    2024年02月15日
    瀏覽(25)
  • 【MySQL】一文帶你了解數(shù)據(jù)庫(kù)索引與事務(wù)

    數(shù)據(jù)庫(kù)索引是一種提高數(shù)據(jù)庫(kù)查詢效率的數(shù)據(jù)結(jié)構(gòu)。它可以快速地定位和訪問(wèn)數(shù)據(jù)庫(kù)中的數(shù)據(jù),從而大大提高數(shù)據(jù)庫(kù)查詢的速度和效率。數(shù)據(jù)庫(kù)索引可以根據(jù)不同的查詢需求構(gòu)造多個(gè)索引,以最大化提高查詢效率。 數(shù)據(jù)庫(kù)索引基于各種字段來(lái)創(chuàng)建,在查詢時(shí)可以通過(guò)索引直接

    2024年02月09日
    瀏覽(82)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包