Если обновление .... Где не влияет на строки, создаются ли блокировки? - PullRequest
3 голосов
/ 20 июля 2011

Если я выполняю оператор SQL, например

UPDATE table
SET col = value
WHERE X=Y

И строки не совпадают, поэтому строки не изменяются, будут ли какие-либо блокировки созданы обновлением?

СУБД - Sybase + SQLСервер

Ответы [ 3 ]

0 голосов
/ 20 июля 2011

Вы можете поиграть с этим сценарием и убедиться в том, что иногда блокировки снимаются и удерживаются, даже если строки не обновляются:

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 ;
0 голосов
/ 19 сентября 2011

Если используется оператор обновления, который не влияет на записи, то для оператора обновления берется исключительная блокировка намерений, в то время как в транзакции в качестве первой выбираются строки, за которыми следует обновление, а затем обновление таблицы.нет строк, которые необходимо обновить, эта намеренная блокировка берется для таблицы для транзакции в монопольном режиме.

0 голосов
/ 20 июля 2011

Если поле x проиндексировано, то, вероятно, будет общая блокировка для этого индекса, в то время как ваш UPDATE проверяет его на соответствие записей.

Не должно быть никаких блокировок строк, но все поведение блокировки зависит от ваших настроек изоляции на уровне сервера.

...