Проблема параллелизма в SQL Server 2008 - PullRequest
1 голос
/ 18 августа 2010

У меня есть 2 таблицы - главная и подробная таблица. Основная таблица имеет столбец идентификатора, который является первичным ключом и автоматическим идентификатором. Я написал SP для вставки записей в обе таблицы. В этом SP, когда идентификатор записи вставляется в основную таблицу, current_ident выбирается и сохраняется в переменной, которая затем передается в таблицу подробностей для вставки записей подробностей. Это работает абсолютно нормально, когда транзакции выполняются одна за другой. Но когда несколько пользователей одновременно создают транзакции, иногда подробные записи одной транзакции вставляются для другой транзакции, что опасно. Пожалуйста, помогите мне решить эту проблему.

Ответы [ 3 ]

2 голосов
/ 18 августа 2010

use SCOPE_IDENTITY () (Возвращает последнее значение идентификатора, вставленное в столбец идентификатора в той же области. Область - это модуль: хранимая процедура, триггер, функция или пакет.) Вместо @@ IDENTITY.

2 голосов
/ 18 августа 2010

Я бы использовал SCOPE_IDENTITY() в этом случае.

http://msdn.microsoft.com/en-us/library/ms190315.aspx

0 голосов
/ 18 августа 2010

Правильно ли настроены ваши транзакции?Ваш SP должен выглядеть примерно так

BEGIN TRAN

DECLARE @id INT

INSERT INTO Master (x, y , z) ...
SELECT @id = @@identity

INSERT INTO Child (id, foo, bar) VALUES (@id, ...

COMMIT TRAN
RETURN 0

:Err
ROLLBACK
RETURN 1

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...