2015-06-16 6 views
0

У меня есть хранимая процедура, которая принимает параметр xml. Для простоты можно сказать, что xml представляет собой коллекцию автомобилей. Каждый элемент коллекции представляет собой автомобиль и имеет такие данные, как идентификационный номер и изготовитель. Цель хранимой процедуры - вставить данные в базу данных. Схема базы данных нормализована, поэтому есть таблица для производителя и таблица для автомобилей. У многих автомобилей может быть один и тот же производитель.sql server - блокировка существующих записей в транзакции

Схема выглядит следующим образом: enter image description here

При обработке XML мне нужно вставить производителей перечисленных в XML, которые не в базе данных, а затем вставить автомобили, перечисленные в XML, которые не в база данных.

  1. вставки уникальных производителей из XML в изготовляет таблицу
  2. Вставка записей в таблицу автомобилей с XML, присоединившись к столу производства на имя производителя, чтобы получить соответствующий идентификатор изготовителя.

Между этапами 1 и 2 может быть возможным, чтобы пользователь или какой-либо другой процесс удалил записи о производстве, так что даже если я вставил записи о производстве или уже существовал, что мне было нужно, к тому времени, когда я получу вставляя записи автомобиля, требуемая запись о производстве больше не существует.

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

+0

http://stackoverflow.com/questions/497049/which-lock-hints-should-i-use-t-sql http://www.sqlteam.com/article/introduction-to-locking-in -sql-server –

+0

Поместите обе вставки внутри транзакции. Задача решена. –

+0

Представляем замок не простое решение. Если вы не ожидаете большого количества конфликтов, вы всегда можете проверить результат своей второй вставки и отменить свой первый, если второй не удастся. Возможно, вам придется сделать это снова, но это лучше, чем мертвые блокировки и другие накладные расходы, введенные шлюзами. – Tim3880

ответ

0

Это очень просто, если вы используете транзакцию sql.

псевдокод:

BEGIN TRANSACTION 

INSERT Manufacturers 

INSERT Cars 

COMMIT TRANSACTION 

Ничто не может удалить строку Производителей (ы), вставленный из этого процесса, пока транзакция не будет завершена (принятие или откат).

+0

Да, но если таблица производства уже имеет запись в ней, я не буду вставлять ее, поэтому запись не будет заблокирована. Мне нужно вставить в автомобили, и я буду ссылаться на существующую запись производителя. – Jeremy

Смежные вопросы