SQL 隔離級別

2022-07-21 18:24:14 字數 1765 閱讀 9018

在sql標準中定義了四種隔離級別,每一種級別都規定了乙個事務中所做的修改,哪些在事務內和事務間是可見的,哪些是不可見的。較低階別的隔離通常可以執行更高的併發,系統的開銷也更低。

簡單的介紹四種隔離級別:

1、read uncommitted (未提交讀)

read uncommitted級別,事務中的修改,即使沒有提交,對其他事務也都是可見的。事務可以讀取未提交的資料,這也被稱為髒讀(dirty read)。這個級別會導致很多問題,從效能上來說,read uncommitted不會比其他的級別好太多,但卻缺乏其他級別的很多好處,除非真的有非常必要的理由,在實際應用中一般很少使用。

2、read committed (提交讀)

大多數資料庫系統的預設級別都是read committed(但 mysql 不是)。read committed滿足前面提到的隔離性的簡單定義:乙個事務開始時,只能「看到」已經提交的事物所做的修改。換句話說,乙個事務從開始知道提交之前,所作的任何修改對其他事務都是不可見的。這個級別有時候也叫做不可重複讀

nonrepeatable read

),因為兩次執行相同的查詢,可能會得到不一樣的結果。

3、repeatable read (可重複讀)

repetable read解決了髒讀的問題。該級別保證了在同乙個事物中多次讀取同樣記錄的結果是一致的。但是理論上,可重複讀隔離級別還是無法解決另外乙個幻讀(phantom read)的問題。所謂幻讀,指的是當某個事務在讀取某個範圍內的記錄時,另外乙個事務又在該範圍內插入了新的記錄,當之前的事務再次讀取該範圍的記錄時,會產生幻行(phantom row)。innodb 和 xtradb 儲存引擎通過多版本併發控制(mvcc,multiversion concurrency control) 解決了幻讀的問題。可重複讀是mysql的預設事務隔離級別。

4、serializable (可序列化)

serializable是最高的隔離界別。它通過強制事務序列執行,避免了前面所說的幻讀的問題。簡單來說,serializable會再讀取的每一行資料上都加鎖,所有可能導致大量的超時鎖爭用的問題。實際應用中也很少用到這個隔離級別,只有在非常需要保證資料的一致性而且接受沒有併發的情況下,才考慮採用該級別。

ansi sql 隔離級別

隔離級別

髒讀可能性

不可重複讀可能性

幻讀可能性

加鎖讀read uncommitted

yesyes

yesno

read committed

noyes

yesno

repeatable read

nono

yesno

serializable

nono

noyes

sql 隔離級別

begin trybegin tran insert into dbo.transtesttable values 66,66 update dbo.transtesttable set name 77 where id 66 raiserror error raised in try block....

SQL的隔離級別

資料庫的隔離級別主要是為讀操作定義保護級別的 對於修改寫操作,無論哪種隔離級別都可以保證寫操作的正確執行。sql標準為三種 dirty reads 事務t2提交了資料,事務t1這時讀取了t2提交的資料,t2發生異常rollback,那麼t1讀取的資料就是有問題的資料,是dirty read。unre...

SQL 事務隔離級別

髒讀 包含未提交資料的讀。例如,事務1 更改了某行。事務2 在事務1 提交更改之前讀取已更改的行。如果事務1 回滾更改,則事務2 便讀取了邏輯上從未存在過的行。不可重複讀取 當某個事務不止一次讀取同一行,並且乙個單獨的事務在兩次 或多次 讀取之間修改該行時。因為在同乙個事務內的多次讀取之間修改了該行...