達夢數據庫允許多個客户端同時訪問。當這些客户端併發訪問數據庫中同一部分的數據時,如果沒有采取必要的隔離措施就容易造成併發一致性問題,從而破壞數據的完整性。考慮下圖中的場景:
在時間點1上,var的數值是100。客户端A在時間點2的時候更新了它的值為200,但沒有提交事務。在時間點3的時候,客户端B讀取到了客户端A還未提交的數值200。但在時間點4,客户端A執行了回滾操作。那麼,對於客户端B來説,如果在時間點5再次讀取數據,得到就應該是100。那麼客户端B就有了數據不一致的問題。而造成問題的根本原因在,客户端B讀取到了客户端A還沒有提交的事務中的數據。
為了解決數據在併發訪問時,數據的一致性問題。在SQL標準中定義了四種事務的隔離級別,它們分別是:讀未提交(READ-UNCOMMITTED)、讀已提交(READ-COMMITTED)、可重複讀(REPEATABLE-READ)和可序列化讀(SERIALIZABLE)。 達夢數據庫支持三種事務隔離級別:讀未提交(READ-UNCOMMITTED)、讀提交(READ-COMMITTED)和串行化(SERIALIZABLE)。其中,讀提交是DM 數據庫默認使用的事務隔離級別,可重複讀升級為更嚴格的串行化隔離級。
| 點擊這裏查看視頻講解:【趙渝強老師】:達夢數據庫的事務隔離級別 |
在達夢數據庫中要查看默認的事務隔離級別,可以通過下面的方式來獲取。 (1)使用管理員登錄數據庫。
SQL> conn sysdba/Welcome_1
(2)執行下面的語句獲取事務的隔離級別。
SQL> select para_name,para_value,
case para_value
when 1 then 'Read Commited'
when 3 then 'Serializable'
else 'None'
end as "隔離級別"
from v$dm_ini where para_name='ISOLATION_LEVEL';
# 輸出的信息如下:
行號 PARA_NAME PARA_VALUE 隔離級別
------ --------------- ---------- -------------
1 ISOLATION_LEVEL 1 Read Commited
# 從輸出的信息可以看出,DM數據庫默認的事務隔離級別是讀已提交(READ-COMMITTED)。
數據庫在不同的事務隔離級別下會有不同的行為,從而在併發訪問數據的時候會帶來不同的問題。下表列舉了在不同的SQL標準事務隔離級別下,數據庫可能存在的不同問題。
由於達夢數據庫默認的事務隔離級別是讀已提交(READ-COMMITTED),因此在達夢數據庫中默認是不存在髒讀問題的。