Учитывая В следующей таблицеКак настроить блокировку операции чтения-манипулирования-записи?
Значение последовательности является пользовательским ключом автоматического приращения совмещая буквы и цифры, в частности, потребность клиента в его систему.
Мы создали функцию GetNextSequence(), которая должна возвращать следующее значение последовательности. Шаг к чтению и обновления последовательности идет как следовать
- Считать значение последовательности с помощью KeyId:
SELECT Sequence FROM [Key] WHERE KeyId = @Id
- Разбирает значение последовательности и определить следующее значение
- Записать значение последовательности в таблицу:
UPDATE [Key] SET Sequence = @Sequence WHERE KeyId = @Id
Здесь C# код (упрощенный для ясности):
var transaction = connection.BeginTransaction(IsolationLevel.RepeatableRead);
var currentSequenceValue = SqlUtils.ExecuteScalar(connection, transaction, "SELECT Sequence FROM [Key] WHERE KeyId = @Id", new SqlParameter("@Id", keyId));
var updatedSequenceValue = ParseSequence(currentSequenceValue);
SqlUtils.ExecuteScalar(connection, transaction, "UPDATE [Key] SET Sequence = @Sequence WHERE KeyId = @Id", new SqlParameter("@Id", keyId), new SqlParameter("@Sequence", updatedSequenceValue));
transaction.Commit();
return updatedSequenceValue;
Наша задача находиться в том, что два разных сервера могут получить доступ к той же самой последовательности, и мы в конечном итоге получить тупиковый
транзакции (идентификатор процесса X) был заведен в тупик на ресурсах блокировки с другим процессом и был выбран в качестве тупиковой жертвы. Перезапустите транзакцию.
В C#, я попытался установить другую комбинацию блокировки, как изоляция IsolationLevel.RepeatableRead
или IsolationLevel.Serializable
или в SQL транзакций с использованием таблицы намек ROWLOCK
и HOLDLOCK
, но без успеха.
Я хочу, чтобы каждый сервер мог читать, манипулировать и обновлять последовательность в атомном режиме. Каков правильный способ установки блокировки для этой ситуации?
на боковой ноте это звучит как эта проблема: http://www.codinghorror.com/blog/2008/08/deadlocked.html – BrokenGlass