Когда SqlConnection остается открытым, он обновляется? - PullRequest
0 голосов
/ 27 сентября 2011

В моем проекте ASP.NET я создаю / открываю SqlConnection, когда это необходимо, и закрываю его в Application_EndRequest

Не важно, мне просто интересно, что произойдет, если при подключении (скажем, Соединение A)открывается, база данных обновляется из другого запроса (скажем, Соединение B).

Таким образом, это похоже на

(скажем, изначально х равен 1)

A.Open ()
B.Open ()
B.UpdateX () -> SET x = 2
B.Close ()
A.SelectX () -> это вернет 1 или 2?
A.Close ()

Ответы [ 2 ]

2 голосов
/ 27 сентября 2011

Возвращаемые данные зависят от состояния БД на момент запуска запроса, а не на момент открытия соединения.

Допустим, вы не используете какое-либо конкретное управление транзакциями в вашемкод и давайте предположим, что оператор обновления представляет собой отдельную строку или обновление таблицы.В этом случае соединение a будет видеть X = 2.это связано с тем, что оба соединения будут использовать уровень транзакции по умолчанию, который считывается зафиксированным для обоих соединений.

Теперь в вашем примере нет способа установить соединение. A прочитайте X = 1, если это обновление одного значения в одной строке.Но если вы используете транзакцию для соединения B, не фиксируете и оставляете соединение открытым.Запрос на соединение A будет блокироваться до истечения времени ожидания.По сути, X не будет доступен, пока не будет сделан B.

Также, если вы обновляете 10 миллионов строк в одной транзакции соединения B, а соединение A находилось в другом потоке и транзакции.Соединение A может прочитать некоторые старые / устаревшие / недействительные данные, используя уровень изоляции транзакции «read uncommitted».

Надеюсь, это поможет.

2 голосов
/ 27 сентября 2011

Соединение SQL никогда не обновляется - это не что иное, как канал к серверу.Это означает, что ваш автомобиль обновляется, когда вы перемещаете его в другое место.

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

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

...