Вызывает ли вызов fetchall () после execute (sql) данные во второй раз? - PullRequest
3 голосов
/ 20 августа 2011

Я только что узнал, используя пакет MySQLDb для Python, и я знаком с извлечением строк из оператора select.

cursor.execute("SELECT movie_list_....")
result = cursor.fetchall()

Как я заметил, когда я запускаю первую команду, она отображает 123L, числостроки пострадали.Когда я запускаю вторую команду, данные на самом деле выбираются.

Когда я выполняю fetchall (), снова читает БД в том состоянии, в котором она существовала в то время ?

Значение , о котором я беспокоюсь пример: я выполнил операцию выбора, которая затрагивает 30 строк.Я обрабатываю их по 10 одновременно курсором.fetchmany (10).Затем я складываю эти 10 чисел (это пример!).Первые две итерации прошли успешно, но перед третьей итерацией для таблицы было выполнено обновление , которое затрагивает те же строки .Затем происходит третья итерация.

Итак, будет ли моя сумма отражать базу данных во время запроса на выборку ?Или это будет смесь старых и новых ценностей?

Я помню кое-что в колледже под названием «проблема грязного чтения».Но это было в контексте чтения строк одновременно, а не , как пакеты , как fetchmany ().

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

1 Ответ

2 голосов
/ 20 августа 2011

Зависит от того, берете ли вы «обычный», курсор на стороне клиента или курсор на стороне сервера.

Внутренне, на стороне клиента (CS) используется mysql_store_result(), в то время как на стороне сервера (SS) используется mysql_use_result().

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

Если у вас много данных или вы хотите, чтобы первые появлялись быстро, вы можете воспользоваться подходом SS. Но тогда вам нужно больше заботиться о том, что вы делаете с базой данных, и, возможно, извлекать данные в отдельном потоке, выполняя эту задачу как можно скорее, чтобы снизить нагрузку на базу данных, поскольку таблицы остаются открытыми и заблокированными, пока все данные не будут отправлено и получено. Таким образом, при чтении также не могут происходить изменения данных, но другие пользователи базы данных могут быть задержаны из-за более длительных блокировок таблиц.

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