Одним из ключевых моментов в приложениях с интенсивной базой данных является сокращение транзакций как можно короче.
Сегодня мне было интересно, когда эта транзакция начнется:
using (SqlConnection sqlConnection = new SqlConnection(connectionString))
{
sqlConnection.Open();
/*(1)*/ SqlTransaction sqlTransaction = sqlConnection.BeginTransaction(IsolationLevel.ReadUncommitted);
//Perform some stuff
//...
/*(2)*/ using (SqlCommand command = new SqlCommand(sqlQuery, sqlConnection, sqlTransaction))
{
//Some other stuff
//...
try
{
/*(3)*/sqlCommand.ExecuteNonQuery();
//More irrelevant code
//...
sqlCommand.CommandText = otherQuery;
sqlCommand.ExecuteNonQuery();
sqlTransaction.Commit();
}
catch(Exception)
{
sqlTransaction.Rollback();
throw;
}
}
}
На этапе (1), (2) или (3)? В идеале это должно быть на шаге 3.
Сделка начинается в точке 3, при первом вызове команды на соединение.
Это можно проверить с помощью SQL Server Profiler.