У меня есть хранимая процедура, которая принимает параметр xml. Для простоты можно сказать, что xml представляет собой коллекцию автомобилей. Каждый элемент коллекции представляет собой автомобиль и имеет такие данные, как идентификационный номер и изготовитель. Цель хранимой процедуры - вставить данные в базу данных. Схема базы данных нормализована, поэтому есть таблица для производителя и таблица для автомобилей. У многих автомобилей может быть один и тот же производитель.sql server - блокировка существующих записей в транзакции
Схема выглядит следующим образом:
При обработке XML мне нужно вставить производителей перечисленных в XML, которые не в базе данных, а затем вставить автомобили, перечисленные в XML, которые не в база данных.
- вставки уникальных производителей из XML в изготовляет таблицу
- Вставка записей в таблицу автомобилей с XML, присоединившись к столу производства на имя производителя, чтобы получить соответствующий идентификатор изготовителя.
Между этапами 1 и 2 может быть возможным, чтобы пользователь или какой-либо другой процесс удалил записи о производстве, так что даже если я вставил записи о производстве или уже существовал, что мне было нужно, к тому времени, когда я получу вставляя записи автомобиля, требуемая запись о производстве больше не существует.
Как я могу предотвратить это? Я могу сделать все это в транзакции, которая блокирует записи изготовителя, которые я вставляю до фиксации, но как я могу заблокировать нужные мне записи?
http://stackoverflow.com/questions/497049/which-lock-hints-should-i-use-t-sql http://www.sqlteam.com/article/introduction-to-locking-in -sql-server –
Поместите обе вставки внутри транзакции. Задача решена. –
Представляем замок не простое решение. Если вы не ожидаете большого количества конфликтов, вы всегда можете проверить результат своей второй вставки и отменить свой первый, если второй не удастся. Возможно, вам придется сделать это снова, но это лучше, чем мертвые блокировки и другие накладные расходы, введенные шлюзами. – Tim3880