Если в транзакцию входят два запроса select
если ты хочешь избавиться даже от "грязного" чтения и прерывания своей транзакции - то да, либо высокий уровень транзакции, либо БД с поддержкой версионности.
на самое деле нет, в п.3. твоя транзакция просто будет прервана, если установлена, например, optimistic-блокировки
для того, чтобы не было "грязного чтения", достаточно ReadCommitted, который установлен по-умолчанию.
вообще, твоя база какие блокировки умеет делать - не считая стандартных уровней изоляции?
MS SQL Server 2000
вообще, твоя база какие блокировки умеет делать - не считая стандартных уровней изоляции?уровни изоляции и типы блокировок это совсем разные вещи.
А что за optimistic-блокировки в mssql?
уровни изоляции и типы блокировок это совсем разные вещиОни связаны, по крайней мере в mssql. В зависимости от уровня изоляции select и проч. делают разные блокировки по умолчанию. Т.е. фактически ты можешь хинтами в команде заказать блокировку, которую без хинта команды делала бы только при более высоком уровне изоляции.
А вообще все зависит от твоих транзакций. Нужно рассматривать на более конкретном примере.
Интересно, в mssql 2000 можно как-нибудь нормально в mssql переделать свою транзакцию, чтобы реализация была больше похоже на реализацию снапшот изоляции в mssql 2005
Оставить комментарий
6yrop
Если в бизнес-транзакцию входят два запроса select, то оба запроса надо включать в одну транзакцию, причем с наивысшим уровнем изоляции Serializable. Иначе возможны серьезные проблемы.Например, если читаем данные из двух связанных таблиц A(parent B(child). Если не устанавливать высокий уровень изоляции Serializable, то может произойти следующее (в хронологическом порядке):
1. первый пользователь прочитал таблицу A
2. второй пользователь вставил строку в A, потом в B
3. первый пользователь прочтет лишнюю строку из B, для которой не прочел parent-строку из A.
Я прав?
Но Serializable очень не рекомендуют использовать .
Имхо, лучше dead-lock, и пусть выскочит exception, чем такие косяки.