1. 程式人生 > >SQLServer之建立事務未提交讀

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

第四步:先執行修改指令碼,然後執行讀取指令碼(在修改事務未提交修改結果之前,讀取指令碼可以直接讀取到修改結果)。

修改指令碼執行:

讀取指令碼執行:

第五步:檢視結果,修改事務還未提交修改結果,讀取事務通過設定會話級別可以直接讀取修改事務的結果。