由上表可见仅共享锁是兼容共享锁的。 3.可以被锁的资源类型(锁的粒度) Sql Server 可以锁定不同的资源类型,或者说锁的粒度是不同的。 这些资源的类型可以有:RID or key (row), page, object (for example, table), database。 但row是属于某个page的,page 又是属于某个block(存储块)的 ……, 因此当要锁(exclusive lock)定一格row时,先要用意向锁(intent exclusive lock)锁定该row的上一层粒度page. 同样读取某个记录时在加共享锁之前也要先给对的的page加共享意向锁(intent share lock).
Requested Mode
Granted Exclusive (X)
Granted Shared (S)
Granted Intent Exclusive (IX)
Granted Intent Shared (IS)
Grant Request for Exclusive?
No
No
No
No
Grant Request for Shared?
No
Yes
No
Yes
Grant Request for Intent Exclusive?
No
No
Yes
Yes
Grant Request for Intent Shared?
No
Yes
Yes
Yes
这些锁的粒度一般由Sql server 动态决定,锁是要消耗资源的,一个简单的Sql 语句可能会用到成千上万的锁。它们也会随着Sql语句的执行结束而释放它们所站的资源。 4.和锁有关比较有帮助的Sql:
查看所有锁的信息:
SELECT -- use * to explore other available attributes
request_session_id AS spid,
resource_type AS restype,
resource_database_id AS dbid,
DB_NAME(resource_database_id) AS dbname,
resource_description AS res,
resource_associated_entity_id AS resid,
request_mode AS mode,
request_status AS status
FROM sys.dm_tran_locks;
查看对应的session:
SELECT -- use * to explore
session_id AS spid,
connect_time,
last_read,
last_write,
most_recent_sql_handle
FROM sys.dm_exec_connections
WHERE session_id = @spid
查看session 运行的sql语句:
SELECT session_id, text
FROM sys.dm_exec_connections
CROSS APPLY sys.dm_exec_sql_text(most_recent_sql_handle) AS ST
WHERE session_id = @spid
查看session的运行帐户和相关信息:
SELECT -- use * to explore
session_id AS spid,
login_time,
host_name,
program_name,
login_name,
nt_user_name,
last_request_start_time,
last_request_end_time
FROM sys.dm_exec_sessions
WHERE session_id IN(52, 53);
查看是否有block的session:
SELECT -- use * to explore
session_id AS spid,
blocking_session_id,
command,
sql_handle,
database_id,
wait_type,
wait_time,
wait_resource
FROM sys.dm_exec_requests
WHERE blocking_session_id > 0;
设置锁的超时时间:
SET LOCK_TIMEOUT 5000;
SET LOCK_TIMEOUT -1; // 该句锁的超时时间设置成默认时间