Пул соединений Python sql не обновляет значение

#python #mysql #connection-pooling

#python #mysql #объединение пулов соединений

Вопрос:

У меня есть проблема, связанная с пулом подключений, но я ее не понимаю.

Ниже приведен мой код, и это поведение:

  1. Начиная с пустой таблицы, я ВЫБИРАЮ запрос для несуществующего значения (без результатов)
  2. Затем я выполняю запрос INSERT, он успешно вставляет значение
  3. ОДНАКО после вставки нового значения, если я попытаюсь выполнить больше инструкций SELECT, он работает только 2 раза из 3, всегда терпит неудачу ровно при каждой 3-й попытке (с размером пула = 3. т.е. с размером пула = 10 он будет работать ровно 9 из 10 раз)
  4. наконец, если я перезапущу скрипт, начальный выбор будет закомментирован (но значение указано в таблице перед значениями скрипта) Я получаю вставленное значение, и оно работает каждый раз.

Почему этот код, похоже, «застревает, возвращая пустой результат для соединения, которое не дало результата», до перезапуска скрипта?

(обратите внимание, что он продолжает открывать и закрывать соединения из пула соединений, потому что это берется из веб-приложения, где каждое подключение / закрытие представляет собой отдельный веб-запрос. Здесь я вырезал из него весь «веб» аспект)

 #!/usr/bin/python
import mysql.connector

dbvars = {'host':'h','user':'u','passwd':'p','db':'d'}
# db has 1 empty table 'test' with one varchar field 'id'

con = mysql.connector.connect(pool_name="mypool", pool_size=3, pool_reset_session=False, **dbvars)
cur = con.cursor()
cur.execute("SELECT id FROM test WHERE id = '123';")
result = cur.fetchall()
cur.close()
con.close()

con = mysql.connector.connect(pool_name="mypool")
cur = con.cursor()
cur.execute("INSERT INTO test VALUES ('123');")
con.commit()
cur.close()
con.close()

for i in range(12):
    con = mysql.connector.connect(pool_name="mypool")
    cur = con.cursor()
    cur.execute("SELECT id FROM test WHERE id = '123';")
    result = cur.fetchall()
    cur.close()
    con.close()

    print result
 

Результат приведенного выше:

 [(u'123',)]
[]
[(u'123',)]
[(u'123',)]
[]
[(u'123',)]
[(u'123',)]
[]
[(u'123',)]
[(u'123',)]
[]
[(u'123',)]
 

Опять же, если я не выполняю начальный ВЫБОР перед вставкой, то все они возвращают 123 (если он уже есть в БД). Кажется, что начальный ВЫБОР «повреждает» одно из соединений пула подключений. Кроме того, если я делаю 2 выбора для пустых результатов перед вставкой, то 2 из 3 соединений «повреждены». Наконец, если я делаю 3 выбора перед вставкой, он все равно работает 1 из 3 раз, потому что кажется, что ВСТАВКА «исправляет» соединение (предположительно, имея «результаты»).

  • Ubuntu 18.04
  • Python 2.7.17 (выпущен в октябре 2019)
  • mysql-connector-python 8.0.21 (июнь 2020)
  • Сервер MySQL 5.6.10

Ответ №1:

Похоже, это довольно серьезная ошибка в драйвере python для MySQL. Возможно, какая-то несовместимость конфигурации, но явно ошибка, поскольку ошибка не отображается, но возвращает неправильные результаты запроса.

Я отправил отчет об ошибке в команду MySQL, и в настоящее время его статус «проверен».

https://bugs.mysql.com/bug.php?id=102053