Как .NET транзакции работают с базой данных Sql Server, когда провели небольшой анализ - PullRequest
1 голос
/ 04 августа 2010

Я сделал простой тест, чтобы понять, как транзакции работают в .net

Пример кода, на котором был выполнен мой тест транзакции:

_sqlHelper = new SqlHelper(true);
try
{
    _sqlHelper.ExecuteNonQuery(SpName.sp_UpdateRoomStatus.ToString()
        , Parameters.SqlParam<int?>("DepartmentId", this.DepartmentId, SqlDbType.Int)
        );

    _sqlHelper.ExecuteNonQuery(SpName.sp_UpdateRoomStatus.ToString()
        , Parameters.SqlParam<int?>("DepartmentId", this.DepartmentId, SqlDbType.Int)
        );

    _sqlHelper.CommitTransaction();
}
catch (SqlHelperException ex)
{
    _sqlHelper.RollBackTransaction();
}

Описание о тесте

Когда я пишу новый SqlHelper (true); новая транзакция начинается внутри, и соединение было создано и открыто для базы данных.

_sqlHelper.ExecuteNonQuery(SpName.sp_UpdateRoomStatus.ToString()
    , Parameters.SqlParam<int?>("DepartmentId", this.DepartmentId, SqlDbType.Int)
    );

Теперь функция выше выполняет мою процедуру и вносит изменения в базу данных.

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

Как только управление приходит к 1-й точке останова, я просто позволяю его обработке выполнить, что означает, что 1-я процедура выполнила вставку.

Теперь я отключил провод LAN, так как DB находился в удаленной системе. Что означает потерянное соединение. Следовательно, транзакция будет отменена.

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

Я смущен в этот момент, когда фактическая вставка произошла с 1-го вызова процедуры, поскольку процедура выполнена успешно. Как сервер sql получает уведомление о том, что транзакция выполняется и откат должен быть выполнен.

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

Отсюда также указывается, что сделанные изменения хранятся в базе данных, а не в среде .net.

1 Ответ

1 голос
/ 04 августа 2010

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

По сути, в SqlTransactions (не распространяется) .Net не делает ничего умного, все это обрабатывается базой данных.

...