Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

Другие советы

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

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

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

...

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top