Я сделал простой тест, чтобы понять, как транзакции работают в .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.