詳解關係型數據庫ACID四個特性和怎麼去做事務控制

概述

數據庫管理系統中事務(transaction)的四個特性(分析時根據首字母縮寫依次解釋):原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)

詳解關係型數據庫ACID四個特性和怎麼去做事務控制

ACID特性

所謂事務,它是一個操作序列,這些操作要麼都執行,要麼都不執行,它是一個不可分割的工作單位。(執行單個邏輯功能的一組指令或操作稱為事務)

1. 原子性

原子性是指事務是一個不可再分割的工作單元,事務中的操作要麼都發生,要麼都不發生。

可採用“A向B轉賬”這個例子來說明解釋

在DBMS中,默認情況下一條SQL就是一個單獨事務,事務是自動提交的。只有顯式的使用start transaction開啟一個事務,才能將一個代碼塊放在事務中執行。

2. 一致性

一致性是指在事務開始之前和事務結束以後,數據庫的完整性約束沒有被破壞。這是說數據庫事務不能破壞關係數據的完整性以及業務邏輯上的一致性。

如A給B轉賬,不論轉賬的事務操作是否成功,其兩者的存款總額不變(這是業務邏輯的一致性,至於數據庫關係約束的完整性就更好理解了)。

保障機制(也從兩方面著手):數據庫層面會在一個事務執行之前和之後,數據會符合你設置的約束(唯一約束,外鍵約束,check約束等)和觸發器設置;此外,數據庫的內部數據結構(如 B 樹索引或雙向鏈表)都必須是正確的。業務的一致性一般由開發人員進行保證,亦可轉移至數據庫層面。

3. 隔離性

多個事務併發訪問時,事務之間是隔離的,一個事務不應該影響其它事務運行效果。

在併發環境中,當不同的事務同時操縱相同的數據時,每個事務都有各自的完整數據空間。由併發事務所做的修改必須與任何其他併發事務所做的修改隔離。事務查看數據更新時,數據所處的狀態要麼是另一事務修改它之前的狀態,要麼是另一事務修改它之後的狀態,事務不會查看到中間狀態的數據。

事務最複雜問題都是由事務隔離性引起的。完全的隔離性是不現實的,完全的隔離性要求數據庫同一時間只執行一條事務,這樣會嚴重影響性能。

關於隔離性中的事務隔離等級(事務之間影響),參見相應博文

4. 持久性

這是最好理解的一個特性:持久性,意味著在事務完成以後,該事務所對數據庫所作的更改便持久的保存在數據庫之中,並不會被回滾。(完成的事務是系統永久的部分,對系統的影響是永久性的,該修改即使出現致命的系統故障也將一直保持)

write ahead logging:SQL Server中使用了WAL(Write-Ahead Logging)技術來保證事務日誌的ACID特性,在數據寫入到數據庫之前,先寫入到日誌,再將日誌記錄變更到存儲器中。


事務的控制

事務的開始是隱形聲明的,不用也沒有語句可以進行操作,默認從對數據的修改開始就開始了當前事務。

對數據庫的設置主要有一下語句:

SET TRANSACTION-----設置事務屬性

SET CONSTRANS-------設置約束模式

SAVEPOINT-----------建立存儲點

RELEASE SAVEPOINT---釋放存儲點

ROLLBACK------------回滾

COMMIT--------------提交

1、設置事務屬性

設置事務屬性主要可以用來完成以下工作:

* 指定事務的隔離層

* 規定回滾事務時所使用的存儲空間

* 命名事務

注:SET TRANSACTION必須是事務的第一個語句。並在事務終止後自動失效。

SET TRANSACTION ISOLATION LEVEL READ COMMITED

A事務設置為READ COMMITED,該開始後B事務修改了數據,此時A無法得到新數據,B提交之後,A可以查詢到更新數據。 A不可能錯讀,但可能發生假讀和非重複讀。

在需要併發數很大時應該使用READ COMMITED,對於多用戶併發的性能和響應速度都比較好。

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

事務和事務之間完全隔離開,事務以串行的方式執行。不是說必須等一個結束,而是事務一旦開始,在結束之前查詢到的數據永遠是開始時刻的數據。由於留存的模式會比較多,所以會消耗一定的系統資源。

SET TRANSACTION READ ONLY

當前事務不能有任何修改數據的操作,READ ONLY是SERIALIZABLE的一個子集,基本上屬於最高的安全級。

SET TRANSACTION READ WRITE

在READ的基礎上增加WRITE權限,不常用

2、設置約束延期性

在操作過程中可能需要違反約束向表中插入重複的數據,其實需要設置約束延期性。

設置格式如下:

SET CONSTRAINT ALL |

DEFERRED | IMMEDIATE

可以選擇要延期的約束名,也可以使用ALL關鍵字延期所有的約束

DEFERRED表示延期,IMMEDIATE表示應用

注:理論上在COMMIT前需要設置回IMMEDIATE,但是系統可以隱式自動完成這一操作。

注意:要使用延遲的約束,必須在創建時就進行說明:

ALTER TABLE T1 ADD CONSTRAINT DEFERRABLE INITIALLY IMMEDIATE

後面的DEFERRABLE 指名可以使用延遲,INITIALLY 設定了初始值

3、存儲點

由於事務太大,一次回滾會對系統造成很大的壓力。而且有時候在某一段特定的代碼附近會特別發生錯誤而回滾。這時就需要在希望的地方設置一個存儲點,可以顯示得操作數據在發生錯誤時回滾到指定的存儲點,而節省不必要的開銷。

創建格式如下:

SAVEPOINT

使用格式如下:

ROLLBACK TO [SAVEPOINT]

4、結束事務

以下操作為將事務結束:

* 使用COMMIT提交事務,數據被永久保存

* 使用ROLLBACK回滾事務(不包括回滾到存儲點)

* 執行DDL時,結束默認COMMIT

* 用戶斷開連接,此時事務自動COMMIT

* 進程意外中止,此時事務自動ROLLBACK

注:事務COMMIT時會生成一個唯一的系統變化號(SCN)保存到事務表


ACID特性是關係數據庫的一個很重要的特點,也是面試過程中會經常問的一個點,大家還是要多熟悉下的。

後面會分享更多關於devops和dba方面的內容,感興趣的朋友可以關注下~

詳解關係型數據庫ACID四個特性和怎麼去做事務控制


分享到:


相關文章: