Sql делает неявный откат, если мой тайм-аут отката? - PullRequest
2 голосов
/ 04 июня 2009

У меня есть приложение dotnet, которое выполняет операторы вставки, обновления, удаления транзакциями

код такой

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

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

Ответы [ 4 ]

2 голосов
/ 04 июня 2009

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

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

1 голос
/ 04 июня 2009

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

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

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

0 голосов
/ 04 июня 2009

Как только откат начался, он ДОЛЖЕН завершиться. Независимо от того, подключены вы или нет, SQL Server все равно выполнит откат. Невозможность выполнить откат приводит к повреждению вашей базы данных и необходимости восстановления.

0 голосов
/ 04 июня 2009

Разрез страницы может выдержать откаты:

http://sqlfool.com/2009/04/page-splitting-rollbacks/

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