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

什么是數(shù)據(jù)庫事務(wù)?更新事務(wù)實現(xiàn)流程是怎樣的

數(shù)據(jù)庫 其他數(shù)據(jù)庫
數(shù)據(jù)庫事務(wù)是對各種數(shù)據(jù)項進(jìn)行訪問和潛在操作的數(shù)據(jù)庫操作序列,必須要么全部執(zhí)行,要么全部不執(zhí)行,在邏輯上構(gòu)成一個不可分割的工作單元。事務(wù)包括從事務(wù)開始到事務(wù)結(jié)束期間執(zhí)行的所有數(shù)據(jù)庫操作。

什么是數(shù)據(jù)庫事務(wù)

數(shù)據(jù)庫事務(wù)是對各種數(shù)據(jù)項進(jìn)行訪問和潛在操作的數(shù)據(jù)庫操作序列,必須要么全部執(zhí)行,要么全部不執(zhí)行,在邏輯上構(gòu)成一個不可分割的工作單元。事務(wù)包括從事務(wù)開始到事務(wù)結(jié)束期間執(zhí)行的所有數(shù)據(jù)庫操作。

并非所有對數(shù)據(jù)庫的操作序列都是數(shù)據(jù)庫事務(wù)。事務(wù)應(yīng)該具備四個核心屬性,即ACID特性:

  • 原子性(Atomicity):事務(wù)作為一個原子單元執(zhí)行,包含的數(shù)據(jù)庫操作要么全部執(zhí)行成功,要么全部回滾,保證數(shù)據(jù)的完整性。
  • 一致性(Consistency):事務(wù)應(yīng)當(dāng)確保數(shù)據(jù)庫的狀態(tài)從一個一致狀態(tài)轉(zhuǎn)變?yōu)榱硪粋€一致狀態(tài),即在事務(wù)執(zhí)行前后,數(shù)據(jù)滿足完整性約束。
  • 隔離性(Isolation):在多個事務(wù)并發(fā)執(zhí)行時,每個事務(wù)的操作應(yīng)當(dāng)與其他事務(wù)相互隔離,互不干擾。
  • 持久性(Durability):一旦事務(wù)提交,對數(shù)據(jù)庫的修改應(yīng)當(dāng)永久保存在數(shù)據(jù)庫中,即使系統(tǒng)發(fā)生故障也不會丟失。

這些屬性共同確保了數(shù)據(jù)庫事務(wù)的可靠性、一致性和持續(xù)性,從而保證了數(shù)據(jù)的安全性和穩(wěn)定性。

通過一個常見的“A賬戶向B賬戶匯款”的例子來說明數(shù)據(jù)庫事務(wù)如何確保數(shù)據(jù)的準(zhǔn)確性和完整性:

  1. 讀取A賬戶余額(500)。
  2. 扣除A賬戶金額(500-100)。
  3. 更新A賬戶余額(400)。
  4. 讀取B賬戶余額(500)。
  5. 向B賬戶加款(500+100)。
  6. 更新B賬戶余額(600)。

原子性:若在第五步時B賬戶不可用,必須回滾至事務(wù)開始前的狀態(tài),確保所有步驟要么全部執(zhí)行,要么全部不執(zhí)行。

一致性:轉(zhuǎn)賬前后,A和B賬戶總金額應(yīng)保持不變,確保數(shù)據(jù)一致性,不會出現(xiàn)負(fù)數(shù)余額等異常情況。

隔離性:A向B轉(zhuǎn)賬過程中,其他事務(wù)對A和B賬戶的查詢不應(yīng)受到影響,各事務(wù)應(yīng)相互獨(dú)立。同時,若同時有C向B轉(zhuǎn)賬的操作,最終B賬戶的金額應(yīng)該是A轉(zhuǎn)給B的金額加上C轉(zhuǎn)給B的金額再加上原有金額。

持久性:一旦成功轉(zhuǎn)賬(事務(wù)提交),A和B賬戶金額就會真正發(fā)生變化并持久保存至數(shù)據(jù)庫,即數(shù)據(jù)寫入后具有持久性。

更新事務(wù)的實際流程

一次InnoDB的update操作是一個涉及多個關(guān)鍵組件的復(fù)雜過程,具體步驟如下:

  1. Buffer Pool緩存數(shù)據(jù)讀?。菏紫葯z查記錄是否在內(nèi)存中,若不在,則從磁盤讀取相關(guān)頁到Buffer Pool中。
  2. 記錄Undo Log:在進(jìn)行修改之前,InnoDB會將修改前的數(shù)據(jù)記錄在Undo Log中。Undo Log的作用在于確保事務(wù)的原子性和一致性,以便在需要時將操作回滾到修改前的狀態(tài)。
  3. 更新Buffer Pool:執(zhí)行update語句時,InnoDB先更新Buffer Pool中的數(shù)據(jù),標(biāo)記數(shù)據(jù)頁為“臟頁”(Dirty Page),表示已修改但尚未寫入磁盤。
  4. 記錄Redo Log Buffer:同時,InnoDB將修改操作記錄在Redo Log Buffer中,確保持久性。
  5. 提交事務(wù):完成所有修改后,事務(wù)提交。InnoDB將Redo Log寫入磁盤,以保證事務(wù)的持久性。
  6. 寫入磁盤:事務(wù)提交后,InnoDB將Buffer Pool中的臟頁異步寫入磁盤,確保數(shù)據(jù)持久存儲。這個寫入過程具有一定延遲,由后臺線程異步執(zhí)行。
  7. 記錄Binlog:在提交時,InnoDB將事務(wù)信息記錄到Binlog中。Binlog用于主從復(fù)制,記錄事務(wù)相關(guān)信息,包括時間戳、數(shù)據(jù)庫名、表名、事務(wù)ID和SQL語句等,用于在從庫上同步主庫的操作。

圖片圖片

需要注意的是在Binlog和Redo Log的寫入過程中,實際上是分為兩個階段進(jìn)行的,采用了兩階段提交的方式來確保數(shù)據(jù)一致性。


責(zé)任編輯:武曉燕 來源: 碼上遇見你
相關(guān)推薦

2024-05-28 00:00:30

Golang數(shù)據(jù)庫

2020-07-17 08:07:54

Spring數(shù)據(jù)庫事務(wù)

2020-11-18 10:16:52

數(shù)據(jù)庫回滾事務(wù)

2020-11-18 08:32:07

數(shù)據(jù)庫

2024-04-08 10:11:15

MYSQL數(shù)據(jù)庫事務(wù)

2010-07-05 17:41:37

SQL Server

2020-06-17 16:56:36

數(shù)據(jù)庫MySQL跨行事務(wù)

2010-10-08 09:38:55

Android數(shù)據(jù)庫事

2020-08-19 09:45:29

Spring數(shù)據(jù)庫代碼

2017-08-22 17:10:45

數(shù)據(jù)庫MySQL事務(wù)模型

2021-09-07 10:33:42

MySQL事務(wù)隔離性

2009-09-24 14:12:22

Hibernate數(shù)據(jù)

2010-06-30 17:27:32

SQL Server數(shù)

2019-08-19 10:24:33

分布式事務(wù)數(shù)據(jù)庫

2023-10-11 08:09:53

事務(wù)隔離級別

2018-07-20 11:10:21

數(shù)據(jù)庫事務(wù)隔離性

2018-06-15 08:23:55

Key-Value數(shù)據(jù)庫MVCC

2010-09-07 15:20:58

SQL語句事務(wù)

2018-07-17 10:58:45

數(shù)據(jù)庫數(shù)據(jù)庫事務(wù)隔離級別

2023-05-23 16:25:48

MyBatisSQL數(shù)據(jù)庫
點(diǎn)贊
收藏

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