2009-06-04 2 views
2

У меня есть Dotnet Applicaton, которая выполняет набор вставки, обновления, удаления заявления в transactionaly образомПредоставляет ли Sql неявный откат, если мой тайм-аут отката?

Код как этот

try 
{ 
mytrans = mycon.begintransaction(); 
//execute sql statements 
mytrans.commit(); 
} 
catch(Exception) 
{ 
mytrans.rollback(); 
} 

Проблема в том, что иногда мы столкнулись исключения тайм-аута в откате и I что размер базы данных (файл mdf) увеличился !!! Значит, Sql не будет делать неявный откат? если да, то как я могу оправиться от этой ошибки и перейти в исходное состояние ???

ответ

2

Основная концепция транзакций требует, чтобы транзакции, которые не были зафиксированы, не влияют на состояние базы данных.

Размер файла ничего не значит. Структуры данных РСУБД гораздо сложнее, чем просто добавление строки в файл - они включают в себя журналы и индексы, поэтому файл может расти и сокращаться совершенно независимо от объема данных в БД.

+0

Значит, транзакция, которая не совершена, будет неявным откатом, не так ли? если это так Какова цель метода отката –

+0

Да, транзакция, которая не была совершена, неявно откатывается при закрытии соединения БД (возможно, таймаутом). Точка метода отката - это дать вашей программе контроль над этим, так как могут быть ситуации, когда откат вызван не техническими проблемами, а программной логикой, то есть программа запускает транзакцию, делает некоторые вещи, а затем решает откат транзакции и сделать что-то другое вместо того, чтобы использовать тот же DB connectionc. –

+0

Хорошо, но моя логика говорит, что сначала я переношу текущие таблицы в свои табличные таблицы, а затем выполняю некоторую обработку во время этого переключения. Я столкнулся с нарушением первичного ключа, поэтому программы пытались выполнить откат и исключение тайм-аута, после чего я обнаружил, что существуют избыточные значения в конкретная историческая таблица !!! это означает, что sql не удалось откат (я так думаю) –

1

Любой SQL, который, возможно, был выполнен, еще не был выполнен. Если ваш откат по какой-то причине перерывает время ожидания, что не приведет к фиксации. Следовательно, в конечном итоге БД будет осознавать, что все потеряно, и отбросит изменения.

Увеличение размера МДФ не является признаком того, что сделка была совершена. Однако результаты транзакции должны быть где-то поставлены. Для совершения транзакции требуется минимальное изменение в БД. Следовательно, страницы могут быть выделены, а данные записаны, а затем зафиксировать только несколько других битов, указывающих во всех правильных местах.

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

0

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