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
第四步:先執行修改腳本,然後執行讀取腳本(在修改事務未提交修改結果之前,讀取腳本可以直接讀取到修改結果)。
修改腳本執行:
讀取腳本執行:
第五步:查看結果,修改事務還未提交修改結果,讀取事務通過設置會話級別可以直接讀取修改事務的結果。
SQLServer之創建事務未提交讀