事務 本篇文章描述了數據庫事務隔離級對鎖的影響,通過對比事務隔離級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、 第一個事務正常執行結束,但只在內存緩沖區完成修改,事務并沒有真正結束,相應也不釋放鎖,第二個事務處于等待狀態??蓤绦衧p_lock和sp_who命令查看。 6、 執行第3步中的提交或回滾命令,第二個事務得到執行。 7、 改變事務隔離級為0,重復執行3-4步。第一個事務沒有任何變化,第二個事務很快出來根據第一個事務修改數據而成的結果,似乎在執行響應上并不受第一個事務的影響。 8、 重復第6步結束。 通過上面的實驗我們知道: 1、 隔離級0時事務允許臟讀,隔離級1時事務不允許臟讀,而只是等待前一個修改事務真正結束并釋放鎖。 2、 隔離級為0時,如果在修改事務的最后是回滾操作,則查詢讀事務將不能讀到正確的數據。 3、 在確信事務中沒有回滾操作的可能,并要求更高的執行效率和并行性,只有這時可考慮設置隔離級為0。 |