天天看點

使用快照隔離snapshot isolation執行個體(一)

以下示例通過嘗試通路鎖定的資料,示範不同隔離級别的行為,并非要在生産代碼中使用。

該代碼連接配接到 SQL Server 中的 AdventureWorks 示例資料庫上,并建立一個名為 TestSnapshot 的表,然後插入一行資料。該代碼使用 ALTER DATABASE Transact-SQL 語句對資料庫啟用快照隔離,但是不設定 READ_COMMITTED_SNAPSHOT 選項,讓預設的 READ COMMITTED 隔離級别的行為生效。然後,該代碼執行下列操作:

開始但是不完成 sqlTransaction1,sqlTransaction1 使用 SERIALIZABLE 隔離級别開始更新事務。這樣做的結果是鎖定表。

打開第二個連接配接,并使用 SNAPSHOT 隔離級别開始第二個事務,讀取 TestSnapshot 表中的資料。因為啟用了快照隔離,此事務可以讀取在開始 sqlTransaction1 之前存在的資料。

打開第三個連接配接,并使用 READ COMMITTED 隔離級别開始一個事務,嘗試讀取表中的資料。在這種情況下,代碼無法讀取資料,因為代碼在第一個事務中無法通過在表上放置的鎖進行讀取,因而逾時。如果使用 REPEATABLE READ 和 SERIALIZABLE 隔離級别,因為這些隔離級别也無法通過第一個事務中放置的鎖,因而會出現同樣的結果。

打開第四個連接配接,并使用 READ UNCOMMITTED 隔離級别開始一個事務,對 sqlTransaction1 中未送出的值執行髒讀。如果第一個事務未送出,資料庫中永遠不會真正存在此值。

復原第一個事務,并通過删除 TestSnapshot 表以及禁用 AdventureWorks 資料庫的快照隔離來進行清理。

View Code

本文轉自xwdreamer部落格園部落格,原文連結:http://www.cnblogs.com/xwdreamer/archive/2010/10/13/2297080.html,如需轉載請自行聯系原作者