Когда SqlConnection остается открытым, обновляется ли он?

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

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

Так что это так

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

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


person Aximili    schedule 27.09.2011    source источник


Ответы (2)


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

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

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

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

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

person Nabheet    schedule 27.09.2011

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

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

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

person TomTom    schedule 27.09.2011