незафиксированные читает? - PullRequest
0 голосов
/ 14 октября 2009

Я смотрел на потенциальные проблемы параллелизма в БД, поэтому я пошел читать. Я нашел http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin/c0005267.htm и там упоминается доступ к незафиксированным данным.

Доступ к незафиксированным данным. Приложение А может обновить значение в база данных и приложение B может прочитайте это значение, прежде чем оно было совершено. Затем, если значение А не позднее совершено, но отступило, расчеты, выполненные B, основанный на незафиксированном (и предположительно неверные данные.

Что ... я думал, что другие сеансы (то же приложение и даже тот же поток) могут читать данные, которые еще не были зафиксированы? Я думал, что только соединение / сеанс (я не уверен в моей терминологии), которое записало данные в незафиксированную транзакцию, может считывать незафиксированные данные.

Могут ли другие потоки действительно читать данные, которые не были зафиксированы? Я планирую использовать MySQL, но я могу использовать SQLite

Ответы [ 4 ]

3 голосов
/ 14 октября 2009

То, что могут прочитать другие сессии, зависит от того, как вы настроили свою базу данных. В MySQL это также зависит от того, какой движок базы данных вы используете. Вы ищете (в терминах ANSI SQL) «уровень изоляции» .

Многие базы данных по умолчанию будут иметь уровень изоляции, при котором чтение незафиксированных данных будет блокироваться. Поэтому, если транзакция A обновляет запись 1234 в таблице T, а затем транзакция B пытается выбрать запись 1234 до того, как A фиксирует или откатывается назад, B блокирует, пока A не выполнит одно из этих действий.

См. Транзакции MySQL, Часть II - Уровни изоляции транзакций .

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

Вы также можете установить его так, чтобы B видел незафиксированные данные, но это часто не рекомендуется.

В качестве альтернативы вы можете использовать схему, называемую MVCC («Управление параллелизмом нескольких версий»), которая дает различным транзакциям согласованное представление данных на основе времени, когда транзакция началась. Это позволяет избежать проблемы незафиксированного чтения (считывания данных, которые могут быть откатаны) и является гораздо более масштабируемым, особенно в контексте долгосрочных транзакций.

MySQL поддерживает MVCC .

0 голосов
/ 14 октября 2009

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

Если говорить конкретно, я работал на очень большом сайте электронной коммерции. Они использовали чтение незафиксированных при чтениях в каталоге магазина, так как к данным был большой доступ, они нечасто менялись и не учитывали опасения по поводу чтения незафиксированных данных. Любые данные из каталога, которые использовались для размещения заказа, все равно будут перепроверены. Это было на SQL Server 2000, который, как было известно, имел проблемы с блокировкой производительности. В более новых версиях SQL Server производительность блокировки улучшилась, поэтому в этом нет необходимости.

0 голосов
/ 14 октября 2009

Эта статья упоминает доступ к незафиксированным данным как одну из проблем , устраненных менеджером базы данных.

Менеджер баз данных контролирует это доступ для предотвращения нежелательных последствий, такие как:

...

  • Доступ к незафиксированным данным.

Механизм хранения MySQL InnoDB поддерживает несколько уровней изоляции транзакций. Подробнее см. http://dev.mysql.com/doc/refman/5.4/en/set-transaction.html.

0 голосов
/ 14 октября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...