2011-08-23 3 views
2

Если я начинаю транзакцию, но никогда не получаю вызов COMMIT. Что происходит с данными? У меня небольшая база данных (скажем, около миллиона SKU). Я экспортирую ее в маленькие четные фрагменты размером 1024 .. (ограничения сторонних пользователей ограничивают размер моего файла).
Я должен отмечать записи, которые были экспортированы ..SQL начать транзакцию без фиксации

например. Обновить набор продуктов exported = 1 где sku = '1234';

Теперь все время от времени у меня есть проблема, которая приводит к сбою стороннего инструмента для записи файлов. Но это происходит до того, как был создан файл для данной записи.

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

Это может привести к нескольким начинающим сделкам, у которых нет их близнецов.

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

ответ

4

Ваши транзакции остаются открытыми с помощью замков, пока соединение не будет полностью закрыто (а не только возвращается в пул соединений). Это плохо

Чтобы сделать UPDATE без явной транзакции и управлять 1024-рядных кусками, сделать что-то вроде этого

UPDATE TOP (1024) 
    Products 
SET 
    exported = 1 
OUTPUT 
    INSERTED.* 
WHERE 
    exported = 0; 

Вы можете изменить это, чтобы использовать столбец статуса, который имеет «Обработка» «экспортированный» и т. д., поэтому вы знаете, когда материал был прочитан, но не экспортирован.

+0

Единственная проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, что я экспортировал запись, пока файл не будет записан. Я полагаю, что я мог бы создать «объявленную» таблицу, а затем на последней фазе нажимать данные, объявленные на HD. Спасибо за информацию о транзакции. – baash05

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