Нужно ли блокировать таблицу БД или просто синхронизировать метод, который записывает в БД при вызове из разных потоков? - PullRequest
0 голосов
/ 03 апреля 2012

Я разрабатываю веб-сервис, которым будут пользоваться несколько клиентов.Я использую EclipseLink в качестве поставщика JPA.При вызове метода в веб-сервисе от клиента, я заметил, что EclipseLink использует поток в пуле потоков для вызова метода, что означает, что метод может быть вызван одновременно из разных потоков в этом пуле потоков.

В некоторых методах я выполняю некоторые критические записи в некоторые таблицы в базе данных, и мне нужно реализовать какой-то механизм блокировки.Это хорошая практика для синхронизации методов при записи в базу данных или мне нужно заблокировать всю таблицу в MySQL?

Некоторые записи выглядят так в псевдокоде:

   1. insert_into_TableA(getLastInsertedIdInTableA + 1);
   2. insert_into_TableB(getLastInsertedIdInTableB + 1);
   3. int id_A = getLastInsertedIdInTableA + 1;
   4. int id_B = getLastInsertedIdInTableB + 1;
   5. insert_into_TableAB(id_A, id_B);

Структура базы данных ниже:

TableA          TableAB         TableB
pk tableA_id    pk tableA_id    pk tableB_id
                pk tableB_id

Мой второй вопрос: я не использую autoincrement в своих таблицах, поэтому рекомендуется вставлять новые строки, чтобы получить идентификатор последней вставленной строкиа затем просто увеличить его на 1, чтобы вставить новую строку?Или я могу использовать некоторые хорошие методы в EclipseLink, чтобы сделать это для меня?

1 Ответ

1 голос
/ 03 апреля 2012

То, что вам нужно, это " транзакция ."

Обычно контейнер проверяет, что новая транзакция запускается при поступлении нового запроса, и фиксирует транзакцию после кодаобработка запроса завершается (если не выдается исключение).

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

Вместо этого используйте «столбец идентификации».В MySQL это будет NOT NULL AUTO_INCREMENT .

...