Как использовать транзакцию и выбрать вместе, с sql2008 - PullRequest
0 голосов
/ 06 сентября 2010

у нас есть сайт ASP.NET с базой данных SQL2008.

Я пытаюсь реализовать транзакции в нашей текущей системе.

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

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

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

Я попытался установить уровень изоляции ReadUncommitted и Serializable.в транзакции, но это не сработало.

Поэтому мне интересно, нужно ли мне также переписать все мои методы выбора, чтобы они могли выбирать все строки, кроме новой строки, которая есть вmake?

Пример:

  • В таблице T есть 10 строк (записей?)
  • Пользователь A вставляет новую строку в таблицу T. Это занимает некоторое время.
  • В то же время, пользователь B хочет выбрать 10 строк, и ему наплевать на новую строку.

Так что я думаю, что мне как-то нужно переписать select пользователя Bзапрос от "выбрать все запрос" до "выбратьвсе строки, которые не связаны с запросом транзакции ".:)

Любые советы очень ценятся, спасибо.

Ответы [ 2 ]

1 голос
/ 06 сентября 2010

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

Вы можете

  • установить уровень изоляции, считанный незафиксированным для выполнения соединениядля выбора или
  • укажите WITH (NOLOCK) подсказку для таблицы, которая заблокирована, или
  • укажите WITH (READPAST) намек на то, что таблица заблокирована

Как я уже сказал, все 3 из этих опций - это то, что вы примените к SELECT, а не INSERT.

Последний вариант может бытьчтобы включить SNAPSHOT изоляцию и изменить значение по умолчанию для базы данных, чтобы использовать его вместо этого (вероятно, сюда следует добавить много предупреждений, если приложение не было создано / протестировано с включенной изоляцией моментальных снимков)

0 голосов
/ 06 сентября 2010

Вероятно, вам нужно установить уровень изоляции на Read Committed Snapshot .

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

Остерегайтесь возможных проблем при использовании этого уровня изоляции.

...