2009-11-09 3 views
0

У меня есть процедура Store, которая вызывается для заполнения одной таблицы всякий раз, когда мы получаем входящие файлы. Иногда мы получаем несколько файлов, и процедура будет вызываться одновременно. Внутри процедуры утверждения достаточно просты, как указано ниже:Решение Deadlock

IF NOT EXISTS (SELECT.... WHERE A=1 B=2) 
    INSERT ... 
ELSE 
    UPDATE ... 
    WHERE A=1 and B=2 
END 

Делая это, я начал получать ошибку повторяющихся записей. Я предполагаю, что две одинаковые записи пытались установить INSERT. Чтобы этого избежать, я помещал эти утверждения в транзакцию с SERIALIZABLE ISOLATION LEVEL.

Все стало еще хуже, и я начал получать ошибку в тупике !!!

Есть что-то не то, что я делаю здесь ??

ответ

0

Попытайтесь изменить уровень изоляции на чтение.

Serializable - супер крупный трудовой молот .. Это предотвратит чтение других данных, которые были изменены, но не зафиксированы. В сочетании с вашим двухступенчатым процессом в sp вы обязательно получите взаимоблокировки.

Проверьте это для деталей: http://msdn.microsoft.com/en-us/library/ms173763.aspx

+0

Я попытался использовать Read Committed, который, я полагаю, является уровнем по умолчанию. Но я все еще получаю дублирующую запись. – wixuser1105

+0

Дайте прочитать незафиксированный ход. Хотя внесение изменений в ответ Эндрю определенно поможет вам решить свои проблемы. –

1

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

Как файлы бывают:

  1. Обратиться в SP, который добавляет файл в очередь сообщений. Это будет неблокировать (используйте таблицу с автоматическим приращением PK)
  2. Имейте отдельный SP, работающий как запланированное задание, которое выводит из очереди (если есть), а затем обрабатывать его. - Избегайте тупиков.