SQLServer之建立事務未提交讀
未提交讀注意事項
使用 SET TRANSACTION ISOLATION LEVEL 指定會話的鎖定級別。
一次只能設定一個隔離級別選項,而且設定的選項將一直對那個連線始終有效,直到顯式更改該選項為止。 事務中執行的所有讀取操作都會在指定的隔離級別的規則下執行,除非語句的 FROM 子句中的表提示為表指定了其他鎖定行為或版本控制行為。
事務隔離級別定義了可為讀取操作獲取的鎖型別。
在事務進行期間,可以隨時將事務從一個隔離級別切換到另一個隔離級別,但有一種情況例外。 即在從任一隔離級別更改到 SNAPSHOT 隔離時,不能進行上述操作。 否則會導致事務失敗並回滾。 但是,可以將在 SNAPSHOT 隔離中啟動的事務更改為任何其他隔離級別。
將事務從一個隔離級別更改為另一個隔離級別之後,便會根據新級別的規則對更改後讀取的資源執行保護。 在更改前讀取的資源將繼續按照以前級別的規則受到保護。
如果在儲存過程或觸發器中發出 SET TRANSACTION ISOLATION LEVEL,則當物件返回控制時,隔離級別會重設為在呼叫物件時有效的級別。
未提交讀會造成髒讀,事務執行期間讀取資料會造成資料前後讀取不一致。
使用T-SQL指令碼開啟未提交讀
第一步:開啟兩個會話,一個會話進行修改操作,一個會話進行讀取操作。
修改指令碼:
--宣告資料庫引用
use testss;
go
--開始事務
begin transaction readtran
update test1 set name='事務共享鎖' where id='1';
waitfor delay '00:00:10';
commit transaction;
go
讀取指令碼:
--宣告資料庫引用
use testss;
go
--開啟事務
begin transaction trans
select * from test1 where id='1';
commit transaction;
go
第二步:首先檢視並記錄資料原始狀態(本例以修改表中名稱為例)。
第三步:設定讀取指令碼隔離級別。
讀取指令碼:
--宣告資料庫引用
use testss;
go
--設定會話隔離級別
set transaction isolation level read committed;
--開啟事務
begin transaction trans
select * from test1 where id='1';
commit transaction;
go
第四步:先執行修改指令碼,然後執行讀取指令碼(在修改事務未提交修改結果之前,讀取指令碼可以直接讀取到修改結果)。
修改指令碼執行:
讀取指令碼執行:
第五步:檢視結果,修改事務還未提交修改結果,讀取事務通過設定會話級別可以直接讀取修改事務的結果。