Следует ли зафиксировать или откатить транзакцию чтения? - PullRequest
88 голосов
/ 21 ноября 2008

У меня есть запрос на чтение, который я выполняю в транзакции, чтобы я мог указать уровень изоляции. Что делать после завершения запроса?

  • Совершить транзакцию
  • Откат транзакции
  • Ничего не делать (что приведет к откату транзакции в конце блока using)

Каковы последствия выполнения каждого из них?

using (IDbConnection connection = ConnectionFactory.CreateConnection())
{
    using (IDbTransaction transaction = connection.BeginTransaction(IsolationLevel.ReadUncommitted))
    {
        using (IDbCommand command = connection.CreateCommand())
        {
            command.Transaction = transaction;
            command.CommandText = "SELECT * FROM SomeTable";
            using (IDataReader reader = command.ExecuteReader())
            {
                // Read the results
            }
        }

        // To commit, or not to commit?
    }
}

РЕДАКТИРОВАТЬ: Вопрос не в том, следует ли использовать транзакцию или есть другие способы установить уровень транзакции. Вопрос в том, имеет ли какое-либо значение то, что транзакция, которая ничего не изменяет, фиксируется или откатывается. Есть ли разница в производительности? Влияет ли это на другие соединения? Есть другие отличия?

Ответы [ 12 ]

0 голосов
/ 21 ноября 2008

Вам нужно блокировать других от чтения тех же данных? Зачем использовать транзакцию?

@ Джоэл - Мой вопрос лучше сформулировать как «Зачем использовать транзакцию в запросе на чтение?»

@ Stefan - Если вы собираетесь использовать AdHoc SQL, а не сохраненный процесс, просто добавьте WITH (NOLOCK) после таблиц в запросе. Таким образом, вы не несете накладные расходы (хотя и минимальные) в приложении и базе данных для транзакции.

SELECT * FROM SomeTable WITH (NOLOCK)

РЕДАКТИРОВАТЬ @ Комментарий 3: Поскольку в тегах вопросов у вас был «sqlserver», я предположил, что MSSQLServer был целевым продуктом. Теперь, когда этот вопрос прояснен, я отредактировал теги, чтобы удалить ссылку на конкретный продукт.

Я до сих пор не уверен, почему вы хотите совершить транзакцию с операцией чтения.

0 голосов
/ 21 ноября 2008

Учитывая, что READ не меняет состояние, я бы ничего не делал. Выполнение коммита ничего не изменит, кроме траты цикла на отправку запроса в базу данных. Вы не выполнили операцию, которая изменила состояние. Аналогично для отката.

Однако вы должны обязательно очистить ваши объекты и закрыть соединения с базой данных. Не закрытие ваших соединений может привести к проблемам, если этот код вызывается повторно.

...