Как исправить команду выбора MySQL, которая дает неправильный результат после обновления в другом подключении БД? - PullRequest
0 голосов
/ 03 июля 2019

Я взял два подключения MySQL DB, используя модуль Python MySQLdb, а именно db и db1. Первое соединение используется для чтения таблицы, а второе соединение для обновления таблицы. Ниже приведена последовательность кода, которую я использовал.

1: чтение идентификатора из пользовательской таблицы с использованием db conncetion; текущее значение 'Y'

2: обновить идентификатор в таблице пользователей до 'N', используя db1 соединение.

3: чтение идентификатора из пользовательской таблицы с использованием соединения db. Но в это время он дает значение «Y».

import MySQLdb

db = MySQLdb.connect("localhost","root","test007","db",charset='')

apikey="123"


cursor=db.cursor()                                             ## fetching no. of data received in valid time range
cursor.execute("select id from USER where apikey=%s",(apikey,))
data=cursor.fetchone()
cursor.close()
print data #current value 'Y'

db1 = MySQLdb.connect("localhost","root","test007","db",charset='')

cursor=db1.cursor()                                             ## fetching no. of data received in valid time range
cursor.execute("update USER set id='N' where apikey=%s",(apikey,))
db1.commit()
cursor.close()
db1.close()

cursor=db.cursor()                                             ## fetching no. of data received in valid time range
cursor.execute("select id from USER where apikey=%s",(apikey,))
data=cursor.fetchone()
cursor.close()
print data
db.close()

На шаге 3 не отображается обновленное значение. Почему это происходит? Как я могу решить эту проблему, не закрывая соединение db и выбрав другое соединение для чтения таблицы после обновления?

Это не фактическая реализация кода. DB1 на самом деле работает из другого файла. Для простоты я только что показал это.

1 Ответ

0 голосов
/ 05 июля 2019

Он делает то, что должен.REPEATABLE-READ означает, что вы видите те же данные, независимо от того, что происходит в других транзакциях.Это, конечно, длится только до тех пор, пока ваша транзакция не прекратится.

Думайте об этом, как о снимке всего набора данных при запуске транзакции.Затем все, что вы делаете или видите (SELECT), застыло во времени.

Либо измените на READ-UNCOMMITTED, либо разбейте SELECTs на отдельные транзакции.

...