成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解 SQL 事務(wù)和 ACID 屬性

數(shù)據(jù)庫
事務(wù)是一系列作為單一原子單元執(zhí)行的一個或多個SQL操作。其目的是確保數(shù)據(jù)庫中的數(shù)據(jù)一致性。事務(wù)具有以下屬性,通常被稱為ACID屬性的首字母縮寫。

引言:SQL中的事務(wù)

想象一下一個使用SQL作為數(shù)據(jù)庫的銀行系統(tǒng)。用戶A想將一些錢存入用戶B的賬戶。如果他們發(fā)送了錢,我們從他們的賬戶余額中扣除了這筆錢,并且我們想要將這筆錢存入用戶B的賬戶,但突然間我們的數(shù)據(jù)庫崩潰了。

這是否意味著我們從用戶A的余額中扣除的錢消失了?嗯,并不是在SQL數(shù)據(jù)庫中,因?yàn)樗鼈兪褂肧QL事務(wù)來處理這些情況。

事務(wù)和ACID屬性

事務(wù)是一系列作為單一原子單元執(zhí)行的一個或多個SQL操作。其目的是確保數(shù)據(jù)庫中的數(shù)據(jù)一致性。事務(wù)具有以下屬性,通常被稱為ACID屬性的首字母縮寫:

  • 原子性(Atomicity): 整個事務(wù)被視為單個單元,要么完全成功,要么完全失敗。
  • 一致性(Consistency): 事務(wù)將數(shù)據(jù)庫從一個有效狀態(tài)轉(zhuǎn)換為另一個有效狀態(tài),保持?jǐn)?shù)據(jù)庫的不變性。
  • 隔離性(Isolation): 并發(fā)事務(wù)的修改在它們提交之前被隔離開來。
  • 持久性(Durability): 一旦事務(wù)已經(jīng)提交,即使系統(tǒng)發(fā)生故障,它也將保持提交狀態(tài)。

SQL事務(wù)中的關(guān)鍵命令

我們使用 BEGIN TRANSACTION 關(guān)鍵字標(biāo)記SQL事務(wù)的開始。

為了保存事務(wù)中進(jìn)行的所有更改,我們將更改 COMMIT 到數(shù)據(jù)庫。

如果在事務(wù)中發(fā)生了錯誤,我們可以使用 ROLLBACK 命令回滾事務(wù)中進(jìn)行的所有更改,將數(shù)據(jù)庫恢復(fù)到事務(wù)開始時的狀態(tài)。

示例:

讓我們回到我們簡單的銀行應(yīng)用程序示例,其中您需要從賬戶A轉(zhuǎn)賬100美元到賬戶B。這涉及兩個步驟:

  • 從賬戶A的余額中扣除金額
  • 將其添加到賬戶B中

為了使事務(wù)成功,必須完成這兩個步驟。下面是如何將其寫為SQL事務(wù)的示例:

BEGIN TRANSACTION;

-- 扣除賬戶A的余額100美元
UPDATE Accounts
SET balance = balance - 100
WHERE account_id = 'A';

-- 檢查賬戶A是否有足夠的余額,如果沒有就回滾
IF @@ROWCOUNT = 0
    ROLLBACK;

-- 將100美元添加到賬戶B的余額
UPDATE Accounts
SET balance = balance + 100
WHERE account_id = 'B';

-- 如果一切正常,則提交事務(wù)
COMMIT;

此事務(wù)執(zhí)行以下操作:

  • 啟動事務(wù) 以確保以下操作是單個原子過程的一部分。
  • 從賬戶A中扣除100美元: 假設(shè)有一個名為 accounts 的表,其中包含列 account_idbalance
  • 檢查賬戶A是否有足夠的資金: 如果賬戶A沒有足夠的錢,使用 ROLLBACK TRANSACTION 回滾事務(wù),取消所有更改。
  • 將100美元添加到賬戶B中: 如果賬戶A有足夠的錢,就向賬戶B添加100美元。
  • 提交事務(wù): 如果兩次更新都成功,則執(zhí)行 COMMIT TRANSACTION 命令,將在此事務(wù)期間進(jìn)行的更改永久應(yīng)用到數(shù)據(jù)庫。

這確保了要么兩個賬戶都適當(dāng)?shù)馗拢丛谌魏我稽c(diǎn)出現(xiàn)問題時都不應(yīng)用任何更改,從而保持?jǐn)?shù)據(jù)的完整性。

SQL事務(wù)的隔離層級

數(shù)據(jù)庫事務(wù)的隔離級別確定事務(wù)的完整性如何維護(hù)以及在多大程度上每個事務(wù)與其他事務(wù)隔離。

SQL標(biāo)準(zhǔn)定義了四個隔離級別,它們在一致性和性能之間進(jìn)行權(quán)衡。

(1) 讀未提交(Read Uncommitted)

  • 描述: 隔離級別最低。事務(wù)甚至可以看到其他事務(wù)尚未提交的更改。
  • 對示例的影響: 在轉(zhuǎn)賬過程中,如果另一個事務(wù)正在更新賬戶A或B的余額,這個事務(wù)可能讀取這些尚未提交的值。這可能導(dǎo)致看到一個實(shí)際上并不存在的余額(如果其他事務(wù)失敗并回滾)。

(2) 讀提交(Read Committed)

  • 描述: 確保事務(wù)只能讀取已提交的數(shù)據(jù)。
  • 對示例的影響: 通過確保只讀取已提交的賬戶A和B余額,避免了“讀未提交”的問題。然而,在事務(wù)內(nèi)多次讀取余額時,如果其他事務(wù)正在修改數(shù)據(jù),它可能看到不同的值(不可重復(fù)讀)。

(3) 可重復(fù)讀(Repeatable Read)

  • 描述: 確保如果事務(wù)第二次讀取數(shù)據(jù),它將找到相同的數(shù)據(jù)值(避免不可重復(fù)讀)。
  • 對示例的影響: 這個級別防止事務(wù)在事務(wù)內(nèi)多次讀取相同數(shù)據(jù)時看到其他事務(wù)所做的更改。在余額檢查和更新操作期間,它有助于保持一致的讀取結(jié)果。然而,它可能不會阻止幻讀(其他事務(wù)添加的新行)。

(4) 可序列化(Serializable)

  • 描述: 最高級別的隔離。事務(wù)完全與其他事務(wù)隔離,就像它們是串行執(zhí)行的一樣。
  • 對示例的影響: 這確保完全隔離。沒有其他事務(wù)可以干擾轉(zhuǎn)賬過程。它阻止所有并發(fā)問題(臟讀、不可重復(fù)讀和幻讀),但以減少并發(fā)性和可能引起鎖定的性能問題為代價。

使用不同的隔離級別,可能會發(fā)生幾種現(xiàn)象,比如臟讀、不可重復(fù)讀或幻讀。讓我們看看這些術(shù)語的含義.

臟讀

臟讀發(fā)生在一個事務(wù)讀取由并發(fā)未提交事務(wù)寫入的數(shù)據(jù)時。因此,如果其他事務(wù)回滾,第一個事務(wù)將讀取從未正式提交到數(shù)據(jù)庫中的數(shù)據(jù)。

示例:

  • 事務(wù)1開始并從賬戶A轉(zhuǎn)賬100美元到賬戶B。
  • 在事務(wù)1提交之前,事務(wù)2開始并讀取賬戶A的余額。
  • 如果事務(wù)1失敗并回滾,事務(wù)2已讀取一個從未正式提交的余額。

不可重復(fù)讀(讀未提交)

當(dāng)事務(wù)在其過程中兩次檢索同一行時,并且兩次讀取之間行內(nèi)的值發(fā)生更改時,就會發(fā)生不可重復(fù)讀。實(shí)質(zhì)上,另一個事務(wù)在兩次讀取之間修改了該行。

示例:

  • 事務(wù)1開始并讀取賬戶A的余額。
  • 事務(wù)2從賬戶A轉(zhuǎn)賬100美元到賬戶B并提交。
  • 事務(wù)1再次讀取賬戶A的余額,并看到與之前不同的余額。

幻讀

幻讀發(fā)生在一個事務(wù)期間,另一個事務(wù)通過添加(或刪除)行到正在讀取的記錄中來更改數(shù)據(jù)。這意味著事務(wù)中的后續(xù)讀取可能返回包含新添加行的一組行,或者不包括原始讀取的已刪除行。

示例:

  • 事務(wù)1開始查詢賬戶A的交易數(shù)量。
  • 事務(wù)2為賬戶A插入了一條新的交易記錄并提交。
  • 事務(wù)1再次查詢賬戶A的交易數(shù)量,發(fā)現(xiàn)比之前多出了一些交易。

顯然,更高的隔離級別減少了可能發(fā)生的現(xiàn)象類型,但以減少并發(fā)性和潛在的性能影響為代價。

責(zé)任編輯:趙寧寧 來源: 小技術(shù)君
相關(guān)推薦

2024-12-02 08:37:04

2020-02-13 10:14:11

MySQL事務(wù)ACID

2010-09-08 15:55:20

SQL事務(wù)特性

2021-10-18 08:41:20

Redis ACID事務(wù)

2023-01-05 12:30:32

Redis

2021-11-29 07:24:08

ACID事務(wù)大數(shù)據(jù)

2019-04-03 09:27:01

MySQLInnoDB務(wù)ACID

2023-12-13 10:11:14

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

2023-02-10 07:00:22

2011-08-15 14:29:52

SQL Server數(shù)事務(wù)

2010-07-02 14:34:35

SQL Server

2012-06-07 09:18:16

ibmdw

2024-10-17 16:08:36

SQL 查詢SQL

2009-11-06 11:07:52

WCF事務(wù)屬性

2011-03-15 10:22:42

SQL Server 聯(lián)機(jī)事務(wù)處理

2009-06-12 09:49:25

EJB事務(wù)屬性EJB事物

2019-01-29 09:36:10

MySQLACID特性

2022-03-30 07:28:24

MySQL數(shù)據(jù)庫ACID

2010-11-19 16:13:06

oracle事務(wù)隔離級

2024-09-23 16:55:18

C#代碼開發(fā)
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 黄色毛片在线观看 | 欧美三级网站 | 看一级毛片视频 | 91精品久久久 | 欧美aaaaaaaa| 狠狠久| 中文字幕色站 | 特级丰满少妇一级aaaa爱毛片 | 日韩高清国产一区在线 | 黄网站免费观看 | 日韩在线免费视频 | 在线日韩精品视频 | 97天天干| 亚洲国产成人在线视频 | 国产成人久久精品 | 自拍偷拍第一页 | 中文久久 | 毛片免费视频 | 久久亚洲国产精品 | 看片一区 | 亚洲三级国产 | 久久精品国产一区 | 国产免费一区 | 亚洲一区在线播放 | 国产98色在线 | 日韩 | 国产精品久久久久久久久图文区 | 91操操操 | 天天干com | 国产一二区视频 | 欧美日韩精品免费观看 | 鸳鸯谱在线观看高清 | 综合精品久久久 | 97天天干| 国产日韩一区 | 国产精品日韩高清伦字幕搜索 | 欧美成人一区二区三区片免费 | 久久一二区 | 中文字幕一区二区三区在线乱码 | 国产97视频在线观看 | 精品久久久av | 欧美日韩中文在线 |