資料庫交易隔離等級,交易隔離等級
事務的特徵:ACID
Atomicity:原子性
Consistency:一致性
Isolation:隔離性
Duration:持久性
在SQL標準中定義了事務的四種隔離等級:
1,read uncommitted 未提交讀
事務中的修改,即使沒有提交,對其他事務也都是可見的。即事務可以讀取未提交的資料,即會產生髒讀。
2,read committed 提交讀
大都數系統都是這個層級的,oracle就是這個層級,但是MySQL不是這個層級的。
該事務層級定義:一個事務開始時,只能“看見”已經提交的事務所做的修改。換句話說,一個事務從開始到提交,所做的任何修改對其他的事務都是不可見的。
3,repeatable read 可重複讀
讀取資料的事務將會禁止寫事務(但允許讀事務),寫事務則禁止任何其他事務。MySQL預設是此層級的。
4,serializable 可序列化
它是最高隔離等級,Serializable會在讀取的每一行資料上都加鎖,所以可能導致大量的逾時和鎖爭用的問題。
事務的隔離等級有什
大多數的資料庫預設隔離等級為:Read Commited 比如 sql server、Oracle少數資料庫預設隔離等級為:Repeatable Read 比如: MySql InnoDB 1、髒讀:(事務沒有提交,提前讀取) :當一個事務正在訪問資料庫,並且對資料進行修改 而這種修改還沒有提交到資料庫中,這是,另外一個事物訪問資料庫,然後使用了這個資料。 2、不可重複讀取(兩次讀的資料不一致) 一個事務內,多次讀同一個資料,在這個事務還沒有結束時,另外一個事務也訪問該同一個資料,那麼在一個事務中的兩次讀資料之間,由於第二個事務的修改,那麼第一個事務兩次分別讀取的資料可能會不一樣,這樣就發生了一個事務內兩次讀到的資料不一致。 3、幻讀:當事務不是獨立執行時發生的一種現象,例如:第一個事務對一個表中的資料進行修改,這種修改涉及到表中的全部資料行,同時,第二個事務也修改這個表中的資料,這種修改時向表中插入一行新資料,那麼以後就會發生操作第一個事務的使用者發現表中還有沒有修改的資料行,就好像幻覺一樣。 4.第一類更新丟失(復原丟失):
當2個事務更新相同的資料來源,如果第一個事務被提交,而另外一個事務卻被撤銷,那麼會連同第一個事務所做的跟新也被撤銷。也就是說第一個事務做的跟新丟失了。
5.第二類更新丟失(覆蓋丟失):
第二類更新丟失實在實際應用中經常遇到的並發問題,他和不可重複讀取本質上是同一類並發問題,通常他被看做不可重複讀取的特例:當2個或這個多個事務查詢同樣的記錄然後各自基於最初的查詢結果更新該行時,會造成第二類丟失更新。因為每個事務都不知道不知道其他事務的存在,最後一個事務對記錄做的修改將覆蓋其他事務對該記錄做的已提交的跟新... Isolation (隔離)屬性一共支援五種事務設定,具體介紹如下:
DEFAULT (預設)使用資料庫設定的隔離等級,由 DBA 預設的設定來決定隔離等級 .
READ_UNCOMMITTED 會出現髒讀、不可重複讀取、幻讀 ( 隔離等級最低,並發效能高 )
READ_COMMITTED 會出現不可重複讀取、幻讀問題(鎖定正在讀取的行)
REPEATABLE_READ 會出幻讀(鎖定所讀取的所有行)
SERIALIZABLE 保證所有的情況不會發生(鎖表)
不可重複讀取的重點是修改 :
同樣的條件 , 你讀取過的資料 , 再次讀取出來發現值不一樣了
幻讀的重點在於新增或者刪除同樣的條件 , 第 1 次和第 2 次讀出來的記錄數不一樣
資料庫隔離等級問題
若你說的這種情況是2個事務(讀寫在一個事務中),不會出現這種情況。
4個事務可能會出現這個問題。