SQL SERVER 锁定的实例
生活随笔
收集整理的這篇文章主要介紹了
SQL SERVER 锁定的实例
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
---實例DB:AdventureWorks2014
--- 創建view DBLocks
USE [AdventureWorks2014]
GO /****** Object: View [dbo].[DBlocks] Script Date: 8/17/2016 6:38:16 PM ******/
SET ANSI_NULLS ON
GO SET QUOTED_IDENTIFIER ON
GO CREATE VIEW [dbo].[DBlocks] AS
SELECT request_session_id as spid,
db_name(resource_database_id) as dbname,
CASE
WHEN resource_type = 'OBJECT' THEN
object_name(resource_associated_entity_id)
WHEN resource_associated_entity_id = 0 THEN 'n/a'
ELSE object_name(p.object_id)
END as entity_name, index_id,
resource_type as resource,
resource_description as description,
request_mode as mode, request_status as status
FROM sys.dm_tran_locks t LEFT JOIN sys.partitions p
ON p.partition_id = t.resource_associated_entity_id
WHERE resource_database_id = db_id();
GO
實例1: Read Commit(SQL SERVER默認隔離級別) 隔離級別下的SELECT
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
BEGIN TRAN
SELECT * FROM [Production].[Product] WHERE Name ='Reflector';
SELECT * FROM [dbo].[DBlocks] WHERE spid= @@SPID
COMMIT TRAN
DBLocks 的輸出結果
| spid | dbname | entity_name | index_id | resource | mode | status |
| 58 | AdventureWorks2014 | sysrowsets | NULL | OBJECT | Sch-S | GRANT |
| 58 | AdventureWorks2014 | n/a | NULL | DATABASE | S | GRANT |
| 58 | AdventureWorks2014 | DBlocks | NULL | OBJECT | IS | GRANT |
Product 表的數據沒有LOCK,所以批處理執行select 操作獲得了共享鎖。SQL SEVER一旦讀完數據之后立即釋放共享鎖。因此執行DBLoks試圖時,上面提到的共享鎖不存在了。
實例2: 可重復讀隔離級別下的SELECT
SQL 批處理
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN TRAN
SELECT * FROM [Production].[Product] WHERE Name ='Reflector';
SELECT * FROM [dbo].[DBlocks] WHERE spid= @@SPID
COMMIT TRAN
DBLocks 的輸出結果
| spid | dbname | entity_name | index_id | resource | description | mode | status |
| 58 | AdventureWorks2014 | sysrowsets | NULL | OBJECT | Sch-S | GRANT | |
| 58 | AdventureWorks2014 | n/a | NULL | DATABASE | S | GRANT | |
| 58 | AdventureWorks2014 | Product | 1 | PAGE | 0.590972222 | IS | GRANT |
| 58 | AdventureWorks2014 | DBlocks | NULL | OBJECT | IS | GRANT | |
| 58 | AdventureWorks2014 | Product | 1 | KEY | (b031e2166063) | S | GRANT |
| 58 | AdventureWorks2014 | Product | 3 | KEY | (489415cc61a4) | S | GRANT |
| 58 | AdventureWorks2014 | Product | NULL | OBJECT | IS | GRANT | |
| 58 | AdventureWorks2014 | Product | 3 | PAGE | 3.626388889 | IS | GRANT |
由于Product表上有聚集索引,數據行就是頁級別的全部索引行,返回兩個數據行上的鎖是鍵鎖,用來尋找相關數據。在Product表上存在Name上的非聚集索引,可以通過Index_ID字段的值來區分聚集所以和非聚集索引,Index_ID=1表示數據行和聚集索引,Index_ID=3表示非聚集索引。由于事務的隔離級別是可重復讀,共享鎖要等到事務結束為止。NOTE:索引行擁有共享鎖(S)而數據分頁,索引分頁以及表本身擁有意向共享鎖(IS)。
實例3:可串行隔離級別下的SELECT
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRAN
SELECT * FROM [Production].[Product] WHERE Name LIKE 'Reflect%';
SELECT * FROM [dbo].[DBlocks] WHERE spid= @@SPID
COMMIT TRAN
DBLocks的輸出結果
| spid | dbname | entity_name | index_id | resource | description | mode | status |
| 58 | AdventureWorks2014 | sysrowsets | NULL | OBJECT | Sch-S | GRANT | |
| 58 | AdventureWorks2014 | n/a | NULL | DATABASE | S | GRANT | |
| 58 | AdventureWorks2014 | Product | 1 | PAGE | 0.590972222 | IS | GRANT |
| 58 | AdventureWorks2014 | n/a | NULL | METADATA | schema_id = 7 | Sch-S | GRANT |
| 58 | AdventureWorks2014 | DBlocks | NULL | OBJECT | IS | GRANT | |
| 58 | AdventureWorks2014 | Product | 1 | KEY | (b031e2166063) | S | GRANT |
| 58 | AdventureWorks2014 | Product | 3 | KEY | (489415cc61a4) | RangeS-S | GRANT |
| 58 | AdventureWorks2014 | Product | NULL | OBJECT | IS | GRANT | |
| 58 | AdventureWorks2014 | Product | 3 | PAGE | 3.626388889 | IS | GRANT |
| 58 | AdventureWorks2014 | Product | 3 | KEY | (53bdd09497c4) | RangeS-S | GRANT |
| 58 | AdventureWorks2014 | NULL | NULL | OBJECT | IS | GRANT |
總結
以上是生活随笔為你收集整理的SQL SERVER 锁定的实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MyBatis foreach循环批量修
- 下一篇: Nginx惊群现象的两种解决办法