Как узнать, когда MySQL INSERT закончен (несколько соединений) - PullRequest
5 голосов
/ 08 марта 2011

У меня ситуация с несколькими соединениями в БД:

db connection 1: INSERT xyz
(very short time passes)
db connection 2: SELECT [looking for xyz]

Иногда SELECT находит xyz, а иногда нет (потому что он находится на другом соединении БД, чем INSERT). Если я поставлю sleep(1) после того, как INSERT then the SELECT всегда найдет xyz.

Для соединения с БД 1, как я могу заставить его ждать, пока не закончится INSERT, и будет доступна новая строка для SELECTs, работающей на другом соединении с БД?

Мой столик innodb. Вариант использования: вставка идентифицированного идентификатора сеанса в соединение 1, затем перенаправление на страницу, прошедшую аутентификацию, и затем, когда приходит запрос на страницу, прошедшую аутентификацию (в другом соединении), мы ищем идентификатор сеанса для аутентификации запроса. Это нормально, если мы немного замедлим вход в систему и заставим его ждать до полного завершения INSERT, чтобы аутентифицированный идентификатор сеанса был доступен для других запросов перед возвратом.

Ответы [ 2 ]

2 голосов
/ 08 марта 2011

Первый вопрос, почему у вас два разных соединения для одного и того же пользователя?

Если вы действительно хотите сохранить два сеанса, вы можете поиграть с блокировкой таблицы .

Соединение 1, отправьте эти операторы sql:

LOCK TABLE mytable WRITE; -- mytable is know locked, nobody else can access it
INSERT xyz; -- insert data in database
UNLOCK TABLES; -- unlock the table, the rows ARE inserted

Соединение 2:

SELECT [looking for xyz]

Если соединение 2 попытается получить доступ к базе данных до того, как соединение 1 разблокирует таблицу,соединение придется ждать.Когда таблица разблокирована, строка будет вставлена, поэтому выбор вернет желаемый результат.

0 голосов
/ 08 марта 2011

Поскольку оператор вставки является транзакцией;как только ваш оператор вставки завершен, он находится в базе данных;Я предполагаю, что эти два соединения с базами данных сделаны с использованием двух разных потоков;и вы вводите обе команды одновременно (в это время еще не вставлен xyz.

с учетом описанного вами варианта использования, я не уверен, должно ли это даже проходить через два разных соединения с базой данных. Однако;прежде всего окажется ложным, вы можете использовать файл блокировки или что-то еще, чтобы указать, что «транзакция» действительно завершена.

...