Да, есть возможность выбирать данные из базы данных во время выполнения транзакции.
Данные, не затронутые вашей транзакцией (например, строки в таблице, которые не обновляются), обычно можно прочитать из других транзакций. (В некоторых ситуациях SQL Server вводит блокировку таблицы, которая останавливает чтение всех строк в таблице, но они являются необычными и чаще всего являются признаком того, что происходит в вашем запросе или на сервере).
Вам необходимо изучить Уровни изоляции транзакций , поскольку они точно определяют, как это поведение будет работать.
Вот код C # для установки уровня изоляции области транзакции.
TransactionOptions option = new TransactionOptions();
options.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
using (TransactionScope sc = new TransactionScope(TransactionScopeOption.Required, options)
{
// Code within transaction
}
В общем, в зависимости от уровня изоляции транзакции, указанного в транзакции (или любых табличных подсказок, таких как NOLOCK), вы получаете разные уровни блокировки данных, которые защищают остальную часть вашего приложения от активности, связанной с вашей транзакцией. Например, с уровнем изоляции транзакции READUNCOMMITTED
вы можете видеть записи в этой транзакции по мере их возникновения. Это допускает грязное чтение, но также предотвращает (большую часть) блокировки данных.
Другой конец шкалы - это уровень изоляции, такой как SERIALIZABLE
, который гарантирует, что ваша транзакция полностью изолирована до тех пор, пока она не будет завершена.