本篇文章描述了數據庫事務隔離級對鎖的影響,通過對比事務隔離級0和1,理解鎖與髒讀的關系。
實驗內容:分別設置0和1級隔離級,執行兩個不同但又有相關的事務。本實驗環境如下:
1、 有權訪問用戶數據庫(在此是aca_database)和對數據庫表有修改和查詢權限。
2、 數據庫中有表auths,包含salary列(數據類型是money),有一定數據量(在此有1萬行)。
步驟:
1、 如在同一台機器,可分別執行兩次“SQL Advantage”,分別用合法帳號登錄,准備各自執行一個事務。
2、 在各自界面打開用戶數據庫aca_database,設置隔離級為1(此亦為缺省值):
set transaction isolation level 1,查看當前隔離級別用select @@isolation
3、 執行第一個事務的前兩句,暫不執行後面的提交或回滾。
begin transaction
update auths set salary=salary+100
commit transaction
(rollback transaction)
4、 執行第二個事務 select sum(salary) from auths
5、 第一個事務正常執行結束,但只在內存緩沖區完成修改,事務並沒有真正結束,相應也不釋放鎖,第二個事務處於等待狀態。可執行sp_lock和sp_who命令查看。
6、 執行第3步中的提交或回滾命令,第二個事務得到執行。
7、 改變事務隔離級為0,重復執行3-4步。第一個事務沒有任何變化,第二個事務很快出來根據第一個事務修改數據而成的結果,似乎在執行響應上並不受第一個事務的影響。
8、 重復第6步結束。
通過上面的實驗我們知道:
1、 隔離級0時事務允許髒讀,隔離級1時事務不允許髒讀,而只是等待前一個修改事務真正結束並釋放鎖。
2、 隔離級為0時,如果在修改事務的最後是回滾操作,則查詢讀事務將不能讀到正確的數據。
3、 在確信事務中沒有回滾操作的可能,並要求更高的執行效率和並行性,只有這時可考慮設置隔離級為0。