前言
隨著大數(shù)據(jù)和互聯(lián)網(wǎng)技術(shù)的不斷發(fā)展,數(shù)據(jù)庫(kù)管理系統(tǒng)的作用越來(lái)越重要,實(shí)現(xiàn)數(shù)據(jù)的快速讀寫(xiě)以及保證數(shù)據(jù)的安全性和完整性成為企業(yè)在選擇數(shù)據(jù)庫(kù)技術(shù)時(shí)最為關(guān)注的問(wèn)題之一。事務(wù)是保證數(shù)據(jù)一致性和完整性的關(guān)鍵機(jī)制之一,因此事務(wù)管理在數(shù)據(jù)庫(kù)技術(shù)中占據(jù)了極為重要的位置。在這里我們將著重介紹華為云數(shù)據(jù)庫(kù) GaussDB 對(duì)事務(wù)的支持及管理,包括事務(wù)應(yīng)用場(chǎng)景、事務(wù)管理、事務(wù)語(yǔ)句、事務(wù)隔離、事務(wù)監(jiān)控等內(nèi)容。
GaussDB 事務(wù)的定義及應(yīng)用場(chǎng)景事務(wù)是數(shù)據(jù)庫(kù)系統(tǒng)中的一個(gè)重要概念,通俗來(lái)講,事務(wù)就是一組數(shù)據(jù)庫(kù)操作看成一個(gè)整體,這個(gè)整體要么全部執(zhí)行成功,要么全部撤銷。
事務(wù)可以應(yīng)用在并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)時(shí),保持?jǐn)?shù)據(jù)的一致性。一些常見(jiàn)的應(yīng)用場(chǎng)景包括轉(zhuǎn)賬操作、訂單修改、銀行交易等。在這些場(chǎng)景中,事務(wù)的功能是保證操作的原子性,即要么全部執(zhí)行成功,數(shù)據(jù)庫(kù)的值正確地更新,即處于一個(gè)“一致?tīng)顟B(tài)”,要么出現(xiàn)異常或系統(tǒng)故障,全部回滾至操作前的狀態(tài),以保證數(shù)據(jù)的準(zhǔn)確性和完整性。
GaussDB 支持 ACID 事務(wù),即原子性、一致性、隔離性和持久性。在 GaussDB 中,事務(wù)是指一組數(shù)據(jù)庫(kù)操作,這些操作要么全部成功,要么全部失敗。當(dāng)一個(gè)事務(wù)提交時(shí),所有的修改都會(huì)被永久保存。如果事務(wù)失敗,則所有的修改都會(huì)被回滾,數(shù)據(jù)庫(kù)狀態(tài)會(huì)被還原到事務(wù)開(kāi)始前的狀態(tài)。GaussDB 還支持分布式事務(wù)(集群事務(wù)),可以涉及到多個(gè)節(jié)點(diǎn)的事務(wù)(本次不做重點(diǎn)介紹)。
原子性(Atomicity):事務(wù)是數(shù)據(jù)庫(kù)的邏輯工作單位,事務(wù)中的操作,要么都做, 要么都不做。
一致性(Consistency):事務(wù)的執(zhí)行結(jié)果必須是使數(shù)據(jù)庫(kù)從一個(gè)一致性狀態(tài)轉(zhuǎn)到另一 個(gè)一致性狀態(tài)。
隔離性(Isolation):數(shù)據(jù)庫(kù)中一個(gè)事務(wù)的執(zhí)行不能被其他事務(wù)干擾。即一個(gè)事務(wù) 的內(nèi)部操作及使用的數(shù)據(jù)對(duì)其他事務(wù)是隔離的,并發(fā)執(zhí)行的 各個(gè)事務(wù)不能相互干擾。
持久性(Durability):事務(wù)一旦提交,對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的改變是永久的。提交后的 操作或者故障不會(huì)對(duì)事務(wù)的操作結(jié)果產(chǎn)生任何影響。
GaussDB 事務(wù)的管理事務(wù)管理是指在使用數(shù)據(jù)庫(kù)系統(tǒng)時(shí),對(duì)事務(wù)的開(kāi)啟、提交、回滾、保存點(diǎn)、分布式事務(wù)等進(jìn)行管理:
啟動(dòng)事務(wù):GaussDB 通過(guò) START TRANSACTION 和 BEGIN 語(yǔ)法啟動(dòng)事務(wù)
設(shè)置事務(wù):GaussDB 通過(guò) SET TRANSACTION 或者 SET LOCAL TRANSACTION 語(yǔ)法設(shè)置事務(wù)
提交事務(wù):GaussDB 通過(guò) COMMIT 或者 END 可完成提交事務(wù)的功能,即提交事務(wù)的所有操作
回滾事務(wù):回滾是在事務(wù)運(yùn)行的過(guò)程中發(fā)生了某種故障,事務(wù)不能繼續(xù)執(zhí)行,系統(tǒng)將事務(wù)中對(duì)數(shù)據(jù)庫(kù)的所有已完成的操作全部撤銷
存儲(chǔ)過(guò)程本身就處于一個(gè)事務(wù)中,開(kāi)始調(diào)用最外圍存儲(chǔ)過(guò)程時(shí)會(huì)自動(dòng)開(kāi)啟一個(gè)事務(wù),在調(diào)用結(jié)束時(shí)自動(dòng)提交或者發(fā)生異常時(shí)回滾。除了系統(tǒng)自動(dòng)的事務(wù)控制外,也可以使用 COMMIT/ROLLBACK 來(lái)控制存儲(chǔ)過(guò)程中的事務(wù)。在存儲(chǔ)過(guò)程中調(diào)用 COMMIT/ROLLBACK 命令,將提交/回滾當(dāng)前事務(wù)并自動(dòng)開(kāi)啟一個(gè)新的事務(wù),后續(xù)的所有操作都會(huì)在此新事務(wù)中運(yùn)行。
示例 1:?jiǎn)?dòng)一個(gè)事務(wù)
--以默認(rèn)方式啟動(dòng)事務(wù)。START TRANSACTION;SELECT * FROM tpcds.reason;END;
--以默認(rèn)方式啟動(dòng)事務(wù)。BEGIN;SELECT * FROM tpcds.reason;END;
--以隔離級(jí)別為 READ COMMITTED,讀/寫(xiě)方式啟動(dòng)事務(wù)。START TRANSACTION ISOLATION LEVEL READ COMMITTED READ WRITE;SELECT * FROM tpcds.reason;COMMIT;
示例 2:設(shè)置事務(wù)
--開(kāi)啟一個(gè)事務(wù),設(shè)置事務(wù)的隔離級(jí)別為 READ COMMITTED,訪問(wèn)模式為 READ ONLY。START TRANSACTION;SET LOCAL TRANSACTION ISOLATION LEVEL READ COMMITTED READ ONLY;COMMIT;示例 3:支持在 PLSQL 的存儲(chǔ)過(guò)程內(nèi)使用 COMMIT/ROLLBACK。
CREATE TABLE EXAMPLE1(COL1 INT);
CREATE OR REPLACE PROCEDURE TRANSACTION_EXAMPLE()ASBEGINFOR i IN 0..20 LOOPINSERT INTO EXAMPLE1(COL1) VALUES (i);IF i % 2 = 0 THENCOMMIT;ELSEROLLBACK;END IF;END LOOP;END;/運(yùn)行結(jié)果:
在 GaussDB 中,控制管理事務(wù)可以采用兩個(gè)方法:原子性和隔離性。原子性指一組操作要么全部執(zhí)行,要么全部不執(zhí)行。隔離性指一個(gè)事務(wù)的操作不受其他事務(wù)干擾,保證并發(fā)執(zhí)行時(shí)數(shù)據(jù)的一致性。
更多事務(wù)管理過(guò)程中的使用場(chǎng)景(支持/不支持調(diào)用的上下文環(huán)境),請(qǐng)參見(jiàn)官網(wǎng)示例:
https://support.huaweicloud.com/centralized-devg-v2-opengauss/devg_03_0713.html
GaussDB 事務(wù)語(yǔ)句
事務(wù)語(yǔ)句可以看作是在事務(wù)中執(zhí)行的一組語(yǔ)句,常見(jiàn)的事務(wù)語(yǔ)句有 insert、update、delete 等。
GaussDB 支持事務(wù)語(yǔ)句,事務(wù)語(yǔ)句組合成一組原子性、隔離性和一致性的操作。例如,下面的所有查詢都包含在同一個(gè)事務(wù)小片中。如果有任何一個(gè)查詢失敗,整個(gè)事務(wù)將回滾。以下是事務(wù)語(yǔ)句的例子:
BEGIN;SELECT balance FROM account WHERE id = 1 FOR UPDATE;UPDATE account SET balance = balance - 100 WHERE id = 1;COMMIT
GaussDB 事務(wù)隔離
GaussDB 支持的事務(wù)隔離級(jí)別包括:Read Uncommitted(讀未提交)、Read Committed(讀提交)、Repeatable Read(重復(fù)讀)、Serializable(序列化,Serializable 是最高的事務(wù)隔離級(jí)別,在該級(jí)別下,事務(wù)串行化順序執(zhí)行,可以避免臟讀、不可重復(fù)讀與幻讀。但是這種事務(wù)隔離級(jí)別效率低下,比較耗數(shù)據(jù)庫(kù)性能,一般不建議使用)。
語(yǔ)法:
{ SET [ LOCAL ] TRANSACTION|SET SESSION CHARACTERISTICS AS TRANSACTION }{ ISOLATION LEVEL { READ COMMITTED | READ UNCOMMITTED | SERIALIZABLE | REPEATABLE READ }| { READ WRITE | READ ONLY } } [, ...]
Read Uncommitted 隔離級(jí)別:最低的隔離級(jí)別,它允許提交了但尚未被寫(xiě)入磁盤(pán)的事務(wù)修改的數(shù)據(jù)被其他事務(wù)所讀取。
SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;2. Read Committed 隔離級(jí)別:這個(gè)級(jí)別保證一個(gè)事務(wù)所見(jiàn)到的數(shù)據(jù),要么是提交事務(wù)所修改的(已經(jīng)將數(shù)據(jù)更新至磁盤(pán)),要么就是其他提交事務(wù)所修改的。
SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL READ COMMITTED;3. Repeatable Read 隔離級(jí)別:保證在一個(gè)事務(wù)內(nèi)重復(fù)執(zhí)行的查詢返回的結(jié)果集是一樣的。特別地,在這個(gè)級(jí)別的情況下,在事務(wù)中第一次讀表時(shí)就會(huì)自動(dòng)獲取到所有被查詢記錄的共享鎖,直到關(guān)閉連接為止。
SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL REPEATABLE READ;
Serializable 隔離級(jí)別:這個(gè)級(jí)別最高,實(shí)現(xiàn)方法是對(duì)數(shù)據(jù)進(jìn)行鎖定,以保證在寫(xiě)操作(INSERT、DELETE 和 UPDATE 等)期間數(shù)據(jù)不會(huì)被訪問(wèn)。
SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL SERIALIZABLE;事務(wù)監(jiān)控是指對(duì)事務(wù)進(jìn)行實(shí)時(shí)的監(jiān)控,包括事務(wù)的狀態(tài)、執(zhí)行時(shí)間、執(zhí)行語(yǔ)句、執(zhí)行結(jié)果等。
GaussDB 事務(wù)監(jiān)控
事務(wù)監(jiān)控可以對(duì)數(shù)據(jù)庫(kù)操作進(jìn)行記錄和追蹤,包括事務(wù)開(kāi)始和結(jié)束的時(shí)間、事務(wù)中執(zhí)行的語(yǔ)句、事務(wù)提交或回滾的狀態(tài)等。可以通過(guò)這些信息來(lái)監(jiān)控事務(wù)的執(zhí)行情況,優(yōu)化性能和調(diào)整配置。
華為云數(shù)據(jù)庫(kù) GaussDB 支持 ACID 事務(wù),事務(wù)隔離級(jí)別支持讀已提交、可重復(fù)讀、序列化三種,并具有分布式事務(wù)支持功能。在實(shí)際應(yīng)用中,GaussDB 的事務(wù)機(jī)制可適用于金融賬務(wù)、電商訂單、物流管理等多種場(chǎng)景。
例如,在電商訂單場(chǎng)景中,可以在一個(gè)事務(wù)中包含插入訂單、更新庫(kù)存、生成支付信息等相關(guān)操作,確保這些操作全部成功或全部失敗,而不會(huì)出現(xiàn)其中某個(gè)操作提交,其他操作失敗的情況。
而在日常開(kāi)發(fā)中,要注意對(duì)事務(wù)的合理使用,避免在一個(gè)事務(wù)中執(zhí)行過(guò)多的操作,盡可能縮小事務(wù)的范圍,減少事務(wù)的執(zhí)行時(shí)間,從而提高系統(tǒng)的并發(fā)性能。
事務(wù)監(jiān)控可以對(duì)數(shù)據(jù)庫(kù)操作進(jìn)行記錄和追蹤,包括事務(wù)開(kāi)始和結(jié)束的時(shí)間、事務(wù)中執(zhí)行的語(yǔ)句、事務(wù)提交或回滾的狀態(tài)等。可以通過(guò)這些信息來(lái)監(jiān)控事務(wù)的執(zhí)行情況,優(yōu)化性能和調(diào)整配置。以下是事務(wù)監(jiān)控的示例:
查看活動(dòng)事務(wù)信息(PG_PREPARED_XACTS 視圖顯示當(dāng)前準(zhǔn)備好進(jìn)行兩階段提交的事務(wù)的信息)
select * from pg_prepared_xacts;
查看事務(wù)狀態(tài)(PG_STAT_ACTIVITY 視圖顯示和當(dāng)前用戶查詢相關(guān)的信息。)
select pid, datname, usename, query, query_start, state from pg_stat_activity where state != 'idle' and state != 'idle in transaction';
總結(jié)
事務(wù)是保證數(shù)據(jù)一致性和完整性的核心機(jī)制之一,對(duì)于一個(gè)數(shù)據(jù)庫(kù)來(lái)說(shuō),事務(wù)的支持和管理是必須的。GaussDB 通過(guò)支持手動(dòng)和自動(dòng)管理事務(wù)、事務(wù)隔離級(jí)別以及事務(wù)監(jiān)控等功能,滿足了企業(yè)對(duì)數(shù)據(jù)一致性和完整性的需求。在日常開(kāi)發(fā)中,需要特別注意事務(wù)的控制和隔離,以保證事務(wù)的正確執(zhí)行,從而提高數(shù)據(jù)的可靠性和安全性。
本文介紹到此結(jié)束,更多操作可在實(shí)際應(yīng)用中參考官方文檔。
審核編輯:湯梓紅
-
云計(jì)算
+關(guān)注
關(guān)注
39文章
7969瀏覽量
139338 -
數(shù)據(jù)庫(kù)
+關(guān)注
關(guān)注
7文章
3900瀏覽量
65761 -
華為云
+關(guān)注
關(guān)注
3文章
2763瀏覽量
18107
發(fā)布評(píng)論請(qǐng)先 登錄
SQLSERVER數(shù)據(jù)庫(kù)是什么
MySQL數(shù)據(jù)庫(kù)是什么
數(shù)據(jù)庫(kù)數(shù)據(jù)恢復(fù)——MongoDB數(shù)據(jù)庫(kù)文件拷貝后服務(wù)無(wú)法啟動(dòng)的數(shù)據(jù)恢復(fù)

數(shù)據(jù)庫(kù)數(shù)據(jù)恢復(fù)—SQL Server附加數(shù)據(jù)庫(kù)提示“錯(cuò)誤 823”的數(shù)據(jù)恢復(fù)案例

分布式云化數(shù)據(jù)庫(kù)有哪些類型
MySQL數(shù)據(jù)庫(kù)的安裝

云數(shù)據(jù)庫(kù)是哪種數(shù)據(jù)庫(kù)類型?
數(shù)據(jù)庫(kù)加密辦法
數(shù)據(jù)庫(kù)數(shù)據(jù)恢復(fù)—Mysql數(shù)據(jù)庫(kù)表記錄丟失的數(shù)據(jù)恢復(fù)流程

數(shù)據(jù)庫(kù)事件觸發(fā)的設(shè)置和應(yīng)用
數(shù)據(jù)庫(kù)數(shù)據(jù)恢復(fù)—MYSQL數(shù)據(jù)庫(kù)ibdata1文件損壞的數(shù)據(jù)恢復(fù)案例
數(shù)據(jù)庫(kù)數(shù)據(jù)恢復(fù)—通過(guò)拼接數(shù)據(jù)庫(kù)碎片恢復(fù)SQLserver數(shù)據(jù)庫(kù)

Oracle數(shù)據(jù)恢復(fù)—異常斷電后Oracle數(shù)據(jù)庫(kù)啟庫(kù)報(bào)錯(cuò)的數(shù)據(jù)恢復(fù)案例

數(shù)據(jù)庫(kù)數(shù)據(jù)恢復(fù)—SQL Server數(shù)據(jù)庫(kù)出現(xiàn)823錯(cuò)誤的數(shù)據(jù)恢復(fù)案例

評(píng)論