Вот мой сценарий: у нас есть база данных, назовем ее Logging, с таблицей, содержащей записи из Log4Net (через MSMQ). Режим восстановления db имеет значение Simple: нам не нужны журналы транзакций - они могут перевернуться.Sql Server: удаление каналов по-прежнему заполняет журнал транзакций; при отказе все удаления откатываются - почему?
У нас есть работа, которая использует данные из sp_spaceused, чтобы определить, встретили ли мы порог определенного размера. Если порог превышен, мы определяем, сколько строк нужно удалить, чтобы уменьшить размер до x процентов от этого порога. (В стороне, я использую exec sp_spaceused MyLogTable
, TRUE
, чтобы получить количество строк и приблизительное приближение их среднего размера, хотя я не уверен, что это лучший способ сделать это. Но это другая проблема.)
затем я пытаюсь кусок удаляет (скажем, 5000, в то время), обернув вызов к sproc, который в основном делает это:
DELETE TOP (@RowsToDelete) FROM [dbo].[MyLogTable]
, пока я удалил то, что должно быть удалено.
В этом случае проблема: если у меня есть много строк для удаления, файл журнала транзакций заполняется. Я могу смотреть его вырастить, запустив
dbcc sqlperf (logspace)
Что озадачивает меня в том, что, когда задание не удается, все удаленные строки получить откат. Другими словами, кажется, что все куски завертываются (каким-то образом) в неявной транзакции.
Я пробовал явно отключать неявные транзакции, обертывая каждый оператор DELETE в BEGIN и COMMIT TRAN, но безрезультатно: удалены все удаленные куски или вообще ничего.
Я знаю простой ответ: Сделайте свой файл журнала достаточно большим, чтобы обрабатывать максимально возможное количество записей, которые вы когда-либо удаляли, но все же, почему это рассматривается как одна транзакция?
Извините, если я пропустил что-то легкое, но я просмотрел множество сообщений о том, как увеличивается файл журнала, режимы восстановления и т. Д., И я не могу понять это.
Другое: после того, как работа не удалась, файл журнала остается на 95-100 процентов в течение некоторого времени, прежде чем он опустится. Тем не менее, если я запускаю
checkpoint
dbcc dropcleanbuffers
он падает до примерно 5% использования.
TIA.
Piotr, спасибо за ваше предложение s. На самом деле, я выполняю «драйвер» sproc из Query Analyzer. Ваш вопрос о внешней транзакции заставляет меня задаться вопросом, задает ли Query Analyzer по умолчанию implicit_transactions? Я проверил Profilier и не видел этого. Тем не менее, я попробую еще раз с SET IMPLICIT_TRANSACTIONS OFF в сеансе Query Analyzer и посмотреть, не влияет ли это (все или некоторые откатываются при отказе). Я отвечу, когда проведу этот тест. Спасибо, Пол –