Я должен использовать транзакции SQL при чтении записей?

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

8
задан Peter Mortensen 20 July 2010 в 15:40
поделиться

7 ответов

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

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


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

8
ответ дан 5 December 2019 в 11:22
поделиться

Для чистого чтения упаковка транзакции не требуется.

В вашем операторе 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

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

3
ответ дан 5 December 2019 в 11:22
поделиться

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

0
ответ дан 5 December 2019 в 11:22
поделиться

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

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

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

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

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

2
ответ дан 5 December 2019 в 11:22
поделиться

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

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

1
ответ дан 5 December 2019 в 11:22
поделиться

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

0
ответ дан 5 December 2019 в 11:22
поделиться

Можно делать транзакции, но для чего это нужно?

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

Вот синтаксис из SQL Server Books Online:

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

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

1
ответ дан 5 December 2019 в 11:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: