Какой уровень чтения транзакций SQL Read я хочу использовать для длительной вставки? - PullRequest
1 голос
/ 31 октября 2008

У меня есть длительная транзакция вставки, которая вставляет данные в несколько связанных таблиц.

Когда эта вставка запущена, я не могу выполнить выбор * из MainTable. Селект просто крутит свои колеса, пока вставка не закончится.

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

Во время транзакции вставки он сбрасывает обработанный бит MainTable для этой строки.

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

Есть идеи, как настроить это в Microsoft SQL 2005? Я просматриваю документацию SET TRANSACTION LEVEL .

Спасибо,
Кит

РЕДАКТИРОВАТЬ: Я не думаю, что одна и та же партия вставки произойдет в одно и то же время. Это двоичные файлы, которые обрабатываются и их данные вставляются в базу данных. Я проверяю, что файл не был обработан, прежде чем проанализировать и вставить данные. Когда я делаю проверку, если файл не был просмотрен прежде, я делаю быструю вставку в MainTable с обработанным битом, установленным в false.

Есть ли способ заблокировать обновляемую строку вместо всей таблицы?

Ответы [ 2 ]

2 голосов
/ 31 октября 2008

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

EDIT

Вы можете обернуть обновление MainTable в транзакцию, которая освободит эту таблицу быстрее, но вы все равно можете столкнуться с другими таблицами.

е

BEGIN TRANSACTION

SELECT @ProcessedBit = ProcessedBit FROM MainTable WHERE ID = XXX

IF  @ProcessedBit = False
    UPDATE MainTable SET ProcessedBit = True WHERE ID = XXX

COMMIT TRANSACTION

IF  @ProcessedBit = False
BEGIN
    BEGIN TRANSACTION
    -- start long running process
    ...
    COMMIT TRANSACTION
END

РЕДАКТИРОВАТЬ, чтобы включить восстановление после ошибок

BEGIN TRANSACTION

SELECT @ProcessedStatus = ProcessedStatus FROM MainTable WHERE ID = XXX

IF  @ProcessedStatus = 'Not Processed'
    UPDATE MainTable SET ProcessedBit = 'Processing' WHERE ID = XXX

COMMIT TRANSACTION

IF  @ProcessedStatus = 'Not Processed'
BEGIN
    BEGIN TRANSACTION
    -- start long running process
    ...

   IF No Errors
   BEGIN
       UPDATE MainTable SET ProcessedStatus = 'Processed' WHERE ID = XXX
       COMMIT TRANSACTION
   ELSE
       ROLLBACK TRANSACTION

END
0 голосов
/ 31 октября 2008

Единственный уровень изоляции, позволяющий одной транзакции считывать изменения, выполненные другой незавершенной транзакцией (до ее фиксации):

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