Транзакции SQL используются для вставки, обновления, но это должно использоваться для чтения записей?
Если вы запрашиваете все записи в одном запросе и возвращаете их за один раз, в этом нет необходимости. Все заключено в неявную транзакцию. То есть, даже если вы вернете один миллион записей, и даже если другие процессы изменяют записи, вы увидите, как все один миллион записей выглядел в один и тот же момент времени.
Единственные случаи, когда вам действительно может понадобиться транзакция (и, часто, конкретная подсказка блокировки) в процессе только для чтения:
- Вы читаете записи «по частям», и вам больше ничего не нужно, чтобы изменять значения во время повторения. [Например, подключенный набор записей в ADO, который вы затем просматриваете.]
- Вы читаете некоторые данные, выполняете некоторые вычисления, затем читаете некоторые связанные данные, но предполагаем, что за это время ничего не изменилось.
Короче говоря, вам нужны транзакции, когда вы хотите, чтобы другие процессы не вмешивались в ваши данные между операторами SQL.
Для чистого чтения упаковка транзакции не требуется.
В вашем операторе 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
На самом деле, вы просто возвращаете баланс, но вся денежная транзакция должна работать в двух местах.
Транзакции предназначены для предотвращения проблем параллелизма, когда одна логическая транзакция фактически отображается на несколько запросов SQL. Например, для банковского счета, если вы переводите деньги с одного счета на другой, вы сначала вычтите сумму со счета, а затем добавите ее к другому (или наоборот). Но если между ними возникнет какая-то ошибка, ваша база данных будет в недопустимом состоянии (вы могли вычесть сумму из одной учетной записи, но не добавить ее в другую). Итак, если вы читаете все свои данные в одном запросе, вам не нужна транзакция.
Если вам нужна самая последняя информация с точностью до миллисекунд, вы можете использовать транзакцию, созданную с помощью TransactionOptions
, имеющую IsolationLevel
из Сериализуемый
.
Это повлияет на производительность, поскольку заблокирует таблицу (или части таблицы), поэтому вам нужно выяснить, действительно ли вам это нужно.
В большинстве случаев, если вы выполняете чтение, вам не нужно оборачивать его транзакцией (при условии, что вы выполняете только чтение в одной операции).
Это действительно зависит от вашего приложения, от того, какие данные ему требуются и как оно их использует.
Например, если вы выполняете чтение и, в зависимости от результатов, выполняете запись или обновление, но критически важно, чтобы данные, которые вы только что считали, были текущими, вам, вероятно, следует заключить всю логику в одну транзакцию.
Нет, транзакции обычно не нужны для чтения данных, и это также замедлит чтение данных.
Я бы посоветовал вам почитать о термине ATOMIC. Это поможет вам понять, для чего нужны транзакции.
Когда вы что-то изменили в транзакции, вы можете использовать оператор чтения, чтобы проверить, вступает ли операция в силу, непосредственно перед фиксацией.
Можно делать транзакции, но для чего это нужно?
Вы можете установить соответствующий уровень изоляции для всего сеанса SQL Server с помощью оператора SET TRANSACTION ISOLATION LEVEL.
Вот синтаксис из SQL Server Books Online:
SET TRANSACTION ISOLATION LEVEL
{
READ COMMITTED
| READ UNCOMMITTED
| REPEATABLE READ
| SERIALIZABLE
}