Я використовую базу даних Microsoft SQL Server 2005 з рівнем ізоляції READ_COMMITTED
та READ_COMMITTED_SNAPSHOT=ON
.
Тепер я хочу використовувати:
SELECT * FROM <tablename> FOR UPDATE
... так що інші підключення до бази даних блокуються при спробі отримати доступ до того самого рядка "ДЛЯ ОНОВЛЕННЯ".
Я намагався:
SELECT * FROM <tablename> WITH (updlock) WHERE id=1
... але це блокує всі інші з'єднання навіть для вибору ідентифікатора, відмінного від "1".
Який правильний підказка робити, SELECT FOR UPDATE
як відомо для Oracle, DB2, MySql?
EDIT 2009-10-03:
Це оператори для створення таблиці та індексу:
CREATE TABLE example ( Id BIGINT NOT NULL, TransactionId BIGINT,
Terminal BIGINT, Status SMALLINT );
ALTER TABLE example ADD CONSTRAINT index108 PRIMARY KEY ( Id )
CREATE INDEX I108_FkTerminal ON example ( Terminal )
CREATE INDEX I108_Key ON example ( TransactionId )
Багато паралельних процесів роблять це SELECT
:
SELECT * FROM example o WITH (updlock) WHERE o.TransactionId = ?
РЕДАКТУВАТИ 05.10.2009:
Для кращого огляду я записав усі випробувані рішення в наступну таблицю:
механізм | SELECT на різних блоках рядків | SELECT на тих самих рядкових блоках ----------------------- + -------------------------- ------ + -------------------------- ROWLOCK | ні | ні updlock, rowlock | так | так xlock, rowlock | так | так повторюванечитання | ні | ні DBCC TRACEON (1211, -1) | так | так рядок, xlock, затримка | так | так оновлення, затримка | так | так UPDLOCK, READPAST | ні | ні Я шукаю | ні | так