回顧下mysql資料庫的隔離級別和解決問題主要有四種:
(1)read uncommitted – 不能解決任何缺點
(2)read committed – 髒讀,oracle預設
(3)reapatable read – 不可重複讀,髒讀,mysql預設
(4)serializable – 幻讀,不可重複讀,髒讀,效率低
事務的隔離級別定義主要是針對多併發性問題。即不同的使用者操作同一張表可能引發的問題,才有了事務的隔離。
orcal資料庫支援的事務隔離級別主要有兩種:
oracle支援:read committed 和 serializable。預設的為read committed.
事務隔離級別的設定必須保證在事務開始之前進行設定,設定**如下所示:
例如:oracle中設定事務隔離級別為serializable
set
transaction
isolation
level serializable;
我們可以通過如下例子,理解事務隔離。
通過開啟兩個視窗sqlplus來模擬兩個併發使用者操作同一張表資料,對一行記錄進行刪除操作。
用orcal自帶的資料庫orcl,emp表資料進行模擬測試。
如下圖所示:
開啟兩個視窗,同時刪除模擬併發不了,因為計算機在精確到具體小的時間片時,也是只執行乙個原子操作,因此可以先執行上面的視窗,在執行下面的視窗,執行delete刪除操作,看結果如下。
可以看到由於orcal預設資料庫隔離級別為read commit,只有乙個執行緒刪除一行記錄並且提交事務之後,另乙個執行緒對這行記錄進行刪除操作,因此,下面的執行delete之後,會一直等待,等待上乙個的提交,當上面的執行緒提交之後,我們來看看結果。
說明此時的上面已提交事務,下面的刪除會找不到where條件符合的語句,因此刪除0行記錄。
接下來再看乙個例子:
同樣也是刪除一行記錄,這次試用rollback回滾機制。上面的先執行刪除操作,下面的執行刪除操作會等待。如果這時候上面的執行回滾操作,結果如下:
上面的執行完rollback,事務會回滾到事務開始的地方,這時候會釋放鎖,下面的視窗會執行刪除操作,因為此時where條件能找到記錄。
最後測試髒讀:
如果這個時候下面的還沒有提交事務,這時上面的查詢emp表中的資料,還是會顯示12條記錄,這就是髒讀,即乙個執行緒檢視到另乙個執行緒沒有提交之前的資料。只有下面的提交事務,查詢emp表才會是11條記錄。即確定已被刪除。
serializable
就是乙個執行緒執行增刪改查的操作,這張表就會被鎖住,別的執行緒連查詢都查詢不到這張表的資料,隔離級別最高。雖然隔離級別高,但是很明顯效率低。
如果對資料庫的事務隔離概念,什麼是幻讀,以及什麼是事務特性還不是很明白,可以參考如下博文:
資料庫事務隔離級別
資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable,這四個級別可以逐個解決髒讀 不可重複讀 幻讀這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted rea...
資料庫事務隔離級別
資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable,這四個級別可以逐個解決髒讀 不可重複讀 幻讀這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted rea...
資料庫事務隔離級別
資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable 這四個級別可以逐個解決髒讀 不可重複讀 幻讀 這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted re...