Должен ли я совершить после одного выбора -- mysql поле с участием mysql-python пол Связанный проблема

Should I commit after a single select


13
vote

проблема

русский

Я работаю с MySQL 5.0 от Python с помощью модуля MySQLDB.

Рассмотрим простую функцию для загрузки и возврата содержимого всей таблицы базы данных:

 <код> def load_items(connection):     cursor = connection.cursor()     cursor.execute("SELECT * FROM MyTable")     return cursor.fetchall()   

Этот запрос предназначен для того, чтобы быть простым нагрузкой данных и не иметь никакого транзакционного поведения за пределами этого одиночного <код> SELECT оператора.

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

Должен ли я позвонить <код> connection.commit() вскоре после cursor.execute(...) вызов, чтобы убедиться, что операция не оставила незаконченную транзакцию на соединении?

Английский оригинал

I am working with MySQL 5.0 from python using the MySQLdb module.

Consider a simple function to load and return the contents of an entire database table:

def load_items(connection):     cursor = connection.cursor()     cursor.execute("SELECT * FROM MyTable")     return cursor.fetchall() 

This query is intended to be a simple data load and not have any transactional behaviour beyond that single SELECT statement.

After this query is run, it may be some time before the same connection is used again to perform other tasks, though other connections can still be operating on the database in the mean time.

Should I be calling connection.commit() soon after the cursor.execute(...) call to ensure that the operation hasn't left an unfinished transaction on the connection?

</div
     

Список ответов

15
 
vote
vote
Лучший ответ
 

Есть Thwo вещи, которые вам нужно учитывать:

  1. Уровень изоляции в действии
  2. Какое состояние вы хотите «увидеть» в вашей транзакции

Уровень изоляции по умолчанию в MySQL является <код> REPEATABLE READ , что означает, что если вы запускаете <код> SELECT дважды внутри транзакции, вы увидите точно такие же данные, даже если другие транзакции совершили изменения.

Большинство времени, которые люди ожидают увидеть преданные изменения при запуске второго выбора оператора, которое является поведением READ COMMITTED уровня изоляции.

Если вы не изменили уровень по умолчанию в MySQL, а вы do ждут, чтобы увидеть изменения в базе данных, если вы запускаете выберите дважды в той же транзакции - тогда вы не можете сделать это в «Такая же« транзакция, и вам нужно предать свой первый <код> SELECT оператор.

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

Затем через несколько минут первый процесс выполняет операцию, которая является транзакционной и попытки совершать. Будет ли это совершить неудачу?

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

Если этот «первый процесс» только выбирает данные (то есть «Транзакция только для чтения»), то, конечно, будет работать коммит. Если он попытался изменить данные, что еще одна транзакция уже предана, и вы есть работают с REPEATABLE READ , вы, вероятно, получите ошибку (после ожидания, пока какие-либо замки не будут выпущены). Я не на 100% о поведении MySQL в этом случае.

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

 

There are thwo things you need to take into account:

  1. the isolation level in effect
  2. what kind of state you want to "see" in your transaction

The default isolation level in MySQL is REPEATABLE READ which means that if you run a SELECT twice inside a transaction you will see exactly the same data even if other transactions have committed changes.

Most of the time people expect to see committed changes when running the second select statement - which is the behaviour of the READ COMMITTED isolation level.

If you did not change the default level in MySQL and you do expect to see changes in the database if you run a SELECT twice in the same transaction - then you can't do it in the "same" transaction and you need to commit your first SELECT statement.

If you actually want to see a consistent state of the data in your transaction then you should not commit apparently.

then after several minutes, the first process carries out an operation which is transactional and attempts to commit. Would this commit fail?

That totally depends on your definition of "is transactional". Anything you do in a relational database "is transactional" (That's not entirely true for MySQL actually, but for the sake of argumentation you can assume this if you are only using InnoDB as your storage engine).

If that "first process" only selects data (i.e. a "read only transaction"), then of course the commit will work. If it tried to modify data that another transaction has already committed and you are running with REPEATABLE READ you probably get an error (after waiting until any locks have been released). I'm not 100% about MySQL's behaviour in that case.

You should really try this manually with two different sessions using your favorite SQL client to understand the behaviour. Do change your isolation level as well to see the effects of the different levels too.

</div
 
 
     
     

Связанный проблема

-1  Как решить создание проблемы с таблицей в MySQL? [закрыто]  ( How to solve creating table issue in mysql ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> закрыт. Этот вопрос не соответствует Рекомендациям переполнения ...

0  Пройдите имя таблицы, чтобы выбрать оператор из курсора  ( Pass table name to select statement from cursor ) 
Как я могу использовать значения, возвращаемые из курсора в качестве названий таблиц в MySQL-процедурах? <код> DECLARE cur CURSOR FOR select table_name, col...

0  Набор ToggleButton состояние из входящих данных JSON  ( Set togglebutton status from incoming json data ) 
<Р> Я пытаюсь следовать Android учебник , чтобы изменить базу данных MySQL данные из приложения Android. Я довольно новый для концепции JSON синтаксического р...

0  Pandas импорт не вставляет все строки  ( Pandas import not inserting all rows ) 
Я импортирую файл .csv с 3300 рядами данных через следующее: <код> kendo0 После успешного импорта я делаю запрос «Выбрать * из ...» на моем столе, которы...

0  Процедура ничего не делает  ( Procedure doesnt do anything ) 
Я сделал процедуру в MySQL. Похоже, это выглядит. Я назвал эту процедуру из PHP. После этого звонка стол все еще остается пустым, и я не знаю почему. ...

1  Проблемы проектирования базы данных с отношениями  ( Database design issues with relationships ) 
Я работаю над обновлением для существующей базы данных, которая была разработана без какого-либо из кода для реализации рассматриваемой конструкции. Теперь я ...

0  Как я могу выбрать следующее бронирование MySQL?  ( How can i select the next reservation mysql ) 
У меня есть таблица, вызывающая бронирование, и она содержит все бронирование для каждого автомобиля. И у меня есть поле резервированияStatus, которое означае...

1  Как я могу выбрать, используя пересечение стоимости разделенного запятой?  ( How can i select using an intersection of comma separated value ) 
У меня есть столбец, удерживает значения, разделенные запятыми. <код> 1,2,3 4,6,7 2,3,8 12234,5467,232445,232455,11223 с заданными критериями массива (н...

0  Группировка итогов нестандартными кварталами в MySQL  ( Grouping totals by non standard quarters in mysql ) 
У меня есть простая таблица, которая включает в себя продавец, покупатель, дату транзакции, а также всего. Я хочу суммировать транзакции для каждого продавц...

0  Как я могу получить значение группы записей в группу столбца, используя с функцией в Laravel Eloquent ORM  ( How can i get count of records group by a column using with function in laravel ) 
Мне нужно получить количество записей <код> groupBy с использованием <код> with() функция, известная как adgerage loading. У меня есть две таблицы, имеющие ...

0  Ошибка обновления записи  ( Error updating a record ) 
Я получаю ошибку mysql: #update (ActiveReCord :: authentInvalid) "mysql :: Ошибка: # hy 000got Ошибка 139 из механизма хранения: При попытке обновить те...

1  Доступ к данным из другой базы данных в Joomla 3.2+  ( Accessing data from another database in joomla 3 2 ) 
Я обновляю свои компоненты от Joomla 1.7 до Joomla 3.3 и должен держать оригинальную базу данных. Поэтому мне необходимо получить доступ к данным отображения ...

0  Должен ли я обрабатывать шланг / плохие слова маскировки на стороне сервера (или на стороне клиента) для достижения лучшей производительности?  ( Should i process slang bad words masking on server side or client side to achi ) 
Я разрабатываю в чате в чате в режиме реального времени и необходимость замаскировать плохие слова, которые клиент отправляет. Итак, теперь мне интересно пров...

0  Если запись в таблице A не существует в таблице b сделать что-то, как бы я пошел по этому поводу?  ( If record in table a does not exist in table b do something how would i go abou ) 
У меня есть таблица A с полем, называемым писем, мне нужно проверить таблицу B, которая также имеет поле под названием Emails. Если электронное письмо в табли...

-1  Используйте SELECT Под действие  ( Use select under case statement ) 
Я хочу использовать запрос, который позволяет мне получить два различия в зависимости от фильтра. Я попробовал это, но не работает. <код> CASE WHEN filtre =...

Связанный проблема

-1  Как решить создание проблемы с таблицей в MySQL? [закрыто] 
0  Пройдите имя таблицы, чтобы выбрать оператор из курсора 
0  Набор ToggleButton состояние из входящих данных JSON 
0  Pandas импорт не вставляет все строки 
0  Процедура ничего не делает 
1  Проблемы проектирования базы данных с отношениями 
0  Как я могу выбрать следующее бронирование MySQL? 
1  Как я могу выбрать, используя пересечение стоимости разделенного запятой? 
0  Группировка итогов нестандартными кварталами в MySQL 
0  Как я могу получить значение группы записей в группу столбца, используя с функцией в Laravel Eloquent ORM 
0  Ошибка обновления записи 
1  Доступ к данным из другой базы данных в Joomla 3.2+ 
0  Должен ли я обрабатывать шланг / плохие слова маскировки на стороне сервера (или на стороне клиента) для достижения лучшей производительности? 
0  Если запись в таблице A не существует в таблице b сделать что-то, как бы я пошел по этому поводу? 
-1  Используйте SELECT Под действие 



© 2021 www.qaru.top All Rights Reserved. Q&A House все права защищены


Licensed under cc by-sa 3.0 with attribution required.