Должен ли я использовать транзакции SQL при чтении записей? - PullRequest
8 голосов
/ 21 июня 2010

Транзакции SQL используются для вставки, обновления, но должны ли они использоваться для чтения записей?

Ответы [ 7 ]

8 голосов
/ 21 июня 2010

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

Единственные случаи, когда вам действительно понадобится транзакция (и, часто, особая подсказка блокировки) в процессе только для чтения:
- Вы читаете записи «по частям» и вам больше ничего не нужно, чтобы изменить значения, пока вы его повторяете. [Например, связанный набор записей в ADO, через который вы затем перемещаетесь.]
- Вы читаете некоторые данные, делаете некоторые расчеты, затем читаете некоторые связанные данные, но в предположении за это время ничего не изменилось.


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

3 голосов
/ 21 июня 2010

Перенос транзакций не требуется для чистых чтений.

В вашем выражении SQL Lock Hints должен позаботиться о возвращении правильных данных вам (http://msdn.microsoft.com/en-us/library/aa213026%28SQL.80%29.aspx).

На уровне сервера вы можетеустановить уровни изоляции транзакций (http://msdn.microsoft.com/en-us/library/ms173763.aspx).

Редактировать

Объяснение чистых чтений

Если все ваши операторы SQL имеют такие типы чтений, то вы не делаетенеобходимо заключить в транзакцию

SELECT Col1, Col2
From Table1
    INNER JOIN Table2
        ON Table1.Id = Table2.Table1Id

Если вы читаете результаты, на которые могут параллельно влиять другие транзакции, вы должны включить транзакцию. Например:

BEGIN TRANSACTION

INSERT INTO AccountTransactions (Type, Amount) Values ('Credit', 43.21)
UPDATE AccountSummary SET Balance = Balance + 43.21

SELECT @Balance = Balance FROM AccountSummary

COMMIT TRANSACTION

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

2 голосов
/ 21 июня 2010

Если вам нужна самая последняя информация с точностью до миллисекунды, вы можете использовать транзакцию, построенную с TransactionOptions, имеющим IsolationLevel из Serializable.

Это повлияет на производительность, так как заблокирует таблицу (или ее части), поэтому вам нужно выяснить, действительно ли вам это нужно.

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

Это действительно зависит от вашего приложения, какие данные ему требуются и как оно их использует.

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

1 голос
/ 21 июня 2010

Возможно выполнение транзакций, но для чего это нужно?

Вы можете установить соответствующий уровень изоляции для всего сеанса SQL Server, используя инструкцию SET TRANSACTION ISOLATION LEVEL.

Это синтаксис из электронной документации по SQL Server:

SET TRANSACTION ISOLATION LEVEL 
    {
        READ COMMITTED 
        | READ UNCOMMITTED 
        | REPEATABLE READ 
        | SERIALIZABLE
    }

Блокировка в Microsoft SQL Server .

1 голос
/ 21 июня 2010

Нет, транзакции, как правило, не нужны для чтения данных, и это также замедлит чтение данных.

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

0 голосов
/ 21 июня 2010

Транзакции предназначены для избежания проблем параллелизма, когда одна логическая транзакция фактически отображается на несколько SQL-запросов. Например, для банковского счета, если вы переводите деньги с одного счета на другой, вы сначала вычтите сумму из счета, а затем добавите ее к другому (или наоборот). Но если между вашей базой данных возникнет какая-либо ошибка, она окажется в недопустимом состоянии (возможно, вы вычли сумму из одной учетной записи, но не добавили ее в другую). Итак, если вы читаете все свои данные в одном запросе, вам не нужна транзакция.

0 голосов
/ 21 июня 2010

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

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