ВЫБОР MYSQL ... ДЛЯ ОБНОВЛЕНИЯ Не работает? - PullRequest
2 голосов
/ 30 ноября 2010

У меня проблемы с MySQL, SELECT .. FOR UPDATE, вот запрос, который я пытаюсь выполнить:

SQL = "SELECT * " +
      "FROM " + TableName + " " + 
      "WHERE out_status IN ("+outSStatus+") AND queued <= NOW() " +
      "ORDER BY out_status, id_queue ASC "+ limitSql+
      "FOR UPDATE";

После этого поток выполнит UPDATE и изменит out_status на 99,то есть это должно разблокировать строку.

Я запускаю многопоточное Java-приложение, поэтому 3 потока выполняют этот оператор SQL, но когда поток 1 выполняет его, он не блокирует (скрывает) егорезультаты потоков 2 и 3. Поэтому потоки 2 и 3. получают одинаковые результаты.

Кроме того, каждый поток имеет свое собственное соединение mysql.

Может кто-нибудь помочь мне с этим?ИЛИ, может быть, есть лучшее решение?

Многое оценено.

Ответы [ 3 ]

2 голосов
/ 30 ноября 2010

У меня была похожая проблема. Оба ответа от @Vikash и @Adeel Ansari являются действительными предложениями. Однако я решил проблему, используя InnoDB движок вместо MyISAM. MyISAM разрешает блокировку только на уровне таблицы, но не на уровне строки. Вам все еще нужны транзакции, когда вы используете InnoDB.

1 голос
/ 30 ноября 2010

Это может работать, и вы не можете заметить. Скажем, поток 1 выполнил оператор и совершил транзакцию автоматически, потому что auto-commit был включен. Тогда, конечно, поток 2 сможет запустить это тоже.

Попробуйте отключить auto-commit, используя этот метод класса Connection, а затем посмотрите результат.

1 голос
/ 30 ноября 2010

Вы можете использовать транзакции

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...