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

SQLServer之創建事務未提交讀

共享 com mage 連接 導致 操作 會話 from ted

未提交讀註意事項

使用 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之創建事務未提交讀