如果我運行這樣一個SQL語句如果更新....在哪裏影響沒有行,是否創建了任何鎖?
UPDATE table
SET col = value
WHERE X=Y
,且行的比賽,因此沒有行更改,因此任何鎖由更新產生的?
的DBMS這是Sybase + SQL服務器
如果我運行這樣一個SQL語句如果更新....在哪裏影響沒有行,是否創建了任何鎖?
UPDATE table
SET col = value
WHERE X=Y
,且行的比賽,因此沒有行更改,因此任何鎖由更新產生的?
的DBMS這是Sybase + SQL服務器
如果場x
被索引,那麼很可能會發生在當你的UPDATE
正在檢查它匹配記錄該索引共享鎖。
不應該有任何行鎖,但所有的鎖定行爲是偶然在你server-level isolation settings.
您可以使用此腳本玩,看看自己,有時獲取鎖定,甚至舉行,屆時沒有行被更新:
CREATE TABLE dbo.Test
(
i INT NOT NULL
PRIMARY KEY ,
j INT NULL
) ;
go
INSERT dbo.Test
(i, j)
VALUES (1, 2) ;
GO
SELECT @@spid ;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE ;
BEGIN TRANSACTION ;
UPDATE dbo.Test
SET j = 3
WHERE i = 3 ;
SELECT *
FROM sys.dm_tran_locks
WHERE request_session_id = @@spid;
COMMIT ;
如果使用不影響記錄的更新語句,則在事務中爲更新語句採用排它意向鎖,因爲首先選擇影響行,然後在表上進行更新,但是因爲沒有需要更新的行,所以這個intent鎖定是tak en在專用模式下的交易表上。