Проблемы с кислотой в многопоточной среде - PullRequest
0 голосов
/ 12 ноября 2011

У меня есть многопоточное Java-приложение, которое выполняет много параллельных операций CRUD над базой данных MySQL.Как читается в руководствах по MySQL, структура таблицы InnoDB должна обеспечивать выполнение транзакций в соответствии с принципами ACID.Но у меня все еще есть проблемы, потому что иногда Обновления теряются.Это один из примеров хранимых процедур, которые я использую:

DELIMITER //
CREATE PROCEDURE *** (
    _*** INT,
    _*** INT,
    _*** INT,
    _*** INT
)
BEGIN
  START TRANSACTION;

    UPDATE `***` 
    SET  
      `***`.`***` = `***`.`***` + _***,  
      `***`.`***` = `***`.`***` + _*** + _***,  
      `***`.`***` = DATE_ADD(NOW(), INTERVAL _*** SECOND)  
    WHERE `***`.`***` = _***;

  COMMIT;
END;
// 
DELIMITER ;

1 Ответ

3 голосов
/ 12 ноября 2011

Классы JDBC не являются реентерабельными, поэтому необходимо синхронизировать использование экземпляров объектов соединения, оператора и т. Д. Они не могут безопасно использоваться несколькими потоками одновременно.

Использование пула соединений - хороший способ упорядочить одновременный доступ к базе данных.

Редактировать

Если вы уверены, что потоки никогда не используют одно и то же соединение, вы можете проверить

  • может ли пул быть вне соединений? как это обрабатывается?
  • Может ли быть так, что 2 обновления действуют на одну и ту же запись, где первое перезаписывается?
  • Вы перехватываете все исключения и регистрируете их в своих рабочих?
...