Возможно, вы захотите проверить уровень изоляции транзакций в вашей базе данных. Поведение, которое вы описываете, - это то, что вы можете ожидать, если для него установлено значение REPEATABLE-READ. Вы можете изменить его на READ-COMMITTED.
Поскольку в первоначальном постере проблемы упоминается, что он просто запрашивает базу данных, это не может быть забытый коммит. Вставка коммита кажется обходным решением, поскольку он вызывает начало новой транзакции; и новый снимок может потребоваться установить. Тем не менее, необходимость вставлять коммит перед каждым выбором не кажется мне хорошей практикой программирования.
Нет кода Python для отображения, так как решение заключается в правильной настройке базы данных.
DO проверьте документацию MySQL по адресу http://dev.mysql.com/doc/refman/5.5/en/set-transaction.html.
ПОВТОРЯЮЩАЯ ЧТЕНИЕ
Это уровень изоляции по умолчанию для InnoDB. Для согласованных чтений существует важное отличие от уровня изоляции READ COMMITTED: все согласованные чтения в одной транзакции считывают моментальный снимок, созданный при первом чтении. Это соглашение означает, что если вы выполняете несколько простых (неблокирующих) операторов SELECT в одной транзакции, эти операторы SELECT также согласуются друг с другом. См. Раздел 14.3.9.2, «Согласованные считывания без блокировки».
ПРОЧИТАЙТЕ ОБЯЗАТЕЛЬНО
Отчасти Oracle-подобный уровень изоляции в отношении согласованных (неблокирующих) чтений: каждое согласованное чтение, даже в рамках одной и той же транзакции, устанавливает и считывает свой собственный свежий снимок. См. Раздел 14.3.9.2, «Согласованные считывания без блокировки».
Проверка настроенного уровня изоляции:
>mysql > SELECT @@GLOBAL.tx_isolation, @@tx_isolation;
+-----------------------+-----------------+
| @@GLOBAL.tx_isolation | @@tx_isolation |
+-----------------------+-----------------+
| REPEATABLE-READ | REPEATABLE-READ |
+-----------------------+-----------------+
1 row in set (0.01 sec)
Установка уровня изоляции транзакции READ-COMMITTED
mysql> SET GLOBAL tx_isolation='READ-COMMITTED';
Query OK, 0 rows affected (0.00 sec)
mysql> SET SESSION tx_isolation='READ-COMMITTED';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @@GLOBAL.tx_isolation, @@tx_isolation;
+-----------------------+----------------+
| @@GLOBAL.tx_isolation | @@tx_isolation |
+-----------------------+----------------+
| READ-COMMITTED | READ-COMMITTED |
+-----------------------+----------------+
1 row in set (0.01 sec)
mysql>
И снова запустить приложение ...