Должна быть Транзакция для Запросов Чтения?

Ошибка «не авторизован: требуется аутентификация» из реестра API. это означает, что у вас включена авторизация в самом реестре. либо отключите аутентификацию в реестре и используйте только базовую аутентификацию nginx, либо прокси передайте заголовок «Авторизация» со связанными данными (хитро).

27
задан Kyle West 21 November 2008 в 14:19
поделиться

6 ответов

Таким образом, вы получаете согласованное представление о базе данных. Представьте, что у вас есть две таблицы, которые связаны между собой, но по какой-то причине вы делаете 2 выбора ... в псевдокоде:

myRows = query(SELECT * FROM A)
moreRows = query(SELECT * FROM B WHERE a_id IN myRows[id])

Если между двумя запросами кто-то изменит B, чтобы удалить несколько строк, вы ' у меня будут проблемы.

30
ответ дан 28 November 2019 в 05:35
поделиться

Подобный тому, что заявил RoBorg, Вы сделаете, ВЫБИРАЕТ w/i транзакции для предотвращения чтения фантомных данных между операторами. , НО важно отметить, что уровнем изоляции транзакции по умолчанию в SQL Server является READ, ФИКСИРОВАВШАЯ, который будет только предотвращать грязные чтения; для предотвращения фантомных данных, необходимо было бы использовать, по крайней мере, ПОВТОРЯЕМОЕ ЧТЕНИЕ. "Используйте эту опцию только когда необходимый".

http://msdn.microsoft.com/en-us/library/ms173763.aspx

3
ответ дан 28 November 2019 в 05:35
поделиться

Я нашел, что 'транзакции' ведут себя очень по-другому на различных SQL-серверах. В некоторых случаях запуск транзакции блокирует все другие соединения от способности выполнить любой SQL, пока транзакция не фиксируется или откатывается (MS SQLServer 6.5). Другие не имеют никаких проблем, и только блокируют, когда существует модификация (оракул). Блокировки могут даже расшириться для затрагивания только изменений - блокировки ячейки / блокировки строки / блокировки страницы / блокировки таблицы.

Обычно я использую транзакции только, когда целостность данных между несколькими вставляет / удаляют / операторы обновления должны сохраняться. Даже все еще я предпочитаю реализовывать это использующее определенное DB расположение каскадом, удаляет так, чтобы база данных сделала это автоматически и атомарно.

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

1
ответ дан 28 November 2019 в 05:35
поделиться

Я проверял это последние несколько минут, так как это то, о чем я должен знать больше. Вот что я нашел.

Транзакции были бы полезны для выбора, если вы хотите заблокировать эту строку, когда человек читает записи и не хочет, чтобы она изменялась или читалась. Например, запустите эти запросы:

(в окне запроса 1)

НАЧАТЬ НАБОР ТРАНСАКТОРА * ИЗ MYTABLE WITH (ROWLOCK XLOCK) ГДЕ ID = 1

(в окне запроса 2 )

SELECT * FROM MYTABLE WHERE ID = 1

(окно запроса 2 не вернет результаты, пока вы не запустите его в окне 1)

COMMIT TRAN

Полезные ссылки:

http://msdn.microsoft.com/en-us/library/aa213039.aspx

http: // msdn. microsoft.com/en-us/library/aa213026.aspx

http://msdn.microsoft.com/en-us/library/ms190345.aspx

Моя цель состояла в том, чтобы получить что-то, чтобы заблокировать - и это наконец заработало после добавления туда XLOCK. Просто использование ROWLOCK не работало. Я предполагаю, что он выдавал общую блокировку (и данные были прочитаны) ... но я все еще исследую это.

Добавление - WITH (UPDLOCK ROWLOCK) - позволит вам выбрать и заблокировать строки для обновлений, что поможет с параллелизмом.

Будьте осторожны с настольными подсказками. Если вы начнете применять их случайно, ваша система замедлится, если в вашем приложении появится даже небольшое количество пользователей. Это единственное, что я знал, прежде чем заняться этим;)

1
ответ дан 28 November 2019 в 05:35
поделиться

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

0
ответ дан 28 November 2019 в 05:35
поделиться

Другое серьезное основание, содержащее несколько, транзакция для чтения и для вставки имеет место, Вы хотите вставить рекордную основу на данных, которые Вы получаете от запроса Select, и Вы также хотите фиксировать каждые X вставленных строк.

Две транзакции:

  1. для read\select.
  2. для вставки и фиксации каждые X строк.

позволит Вам сделать это правильно, в то время как с одной транзакцией не разделяют чтение, и запись не позволит Вам сделать фиксацию, не теряя читателя.

0
ответ дан 28 November 2019 в 05:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: