Блокировка таблицы строк одновременного чтения - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть таблица «Последовательные» в SQL Server, в этой таблице хранится число.

У меня есть другая таблица «Данные», в которой хранятся записи, а один из столбцов - это число.это число взято из таблицы «Последователи».

Чтобы назначить последовательность, я прочитал таблицу «Последователи», затем увеличил значение на 1 и сохранил.

Проблема в том, чтопри выполнении нескольких потоков он не считывает текущее значение «Последовательности» и повторяет числа.

Как заблокировать строку таблицы, чтобы только один поток мог читать и обновлять ее одновременно?время и, следовательно, избежать повторения чисел?

1 Ответ

0 голосов
/ 30 апреля 2019

Лучше не иметь этого требования - потому что это означает, что все транзакции, пытающиеся вставить в data, сериализуются и блокируются до тех пор, пока предыдущие не выполнят фиксацию или откат.

В идеале вы должны использовать IDENTITY илиSEQUENCE вместо.

Но ни один из этих способов не гарантирует последовательность, и если это "необходимо иметь", то лучший способ - это обновить атом и прочитать значение одновременно.

Предположим, у вас есть следующая настройка

CREATE TABLE Consecutives
  (
     Scope  VARCHAR(20) PRIMARY KEY,
     Number INT
  );

INSERT INTO Consecutives
VALUES     ('Data',
            76); 

Затем введите код для увеличения значения и чтения результата, в то время как блокировка других транзакций приведена ниже.

DECLARE @Number INT;

UPDATE Consecutives
SET @Number = Number+=1
WHERE Scope = 'Data';

SELECT @Number

При этом используется семантика SET @variable = column = expressionUPDATE, чтобы присвоить переменной значение столбца после обновления.

Это должно быть в той же транзакции, что и вставка в Data, если вы хотите гарантировать отсутствие пробелов (по крайней мере,при отсутствии каких-либо удалений или обновлений в этом столбце)

...