Блокировка таблиц MySQL для многопользовательского сайта JSP / Servlets - PullRequest
0 голосов
/ 23 июля 2011

Здравствуйте, я разрабатываю сайт с JSP / Servlets, работающими на Tomcat для внешнего интерфейса, и с MySql db для внутреннего интерфейса, доступ к которому осуществляется через JDBC.

Многие пользователи сайта могут одновременно обращаться к базе данных и писать в нее, мой вопрос: Нужно ли явно брать блокировки перед каждым доступом на запись / чтение к БД в моем коде? ИЛИ Tomcat справляется с этим для меня?

Также есть ли у вас какие-либо предложения о том, как лучше всего это реализовать? Я написал значительное количество кода JDBC уже без блокировок: /

1 Ответ

2 голосов
/ 23 июля 2011

Я думаю, что вы думаете о транзакциях, когда говорите «замки». На самом низком уровне ваш сервер базы данных уже гарантирует, что параллельные операции чтения не повредят ваши таблицы.

Но если вы хотите обеспечить согласованность между таблицами, вам нужно использовать транзакции. Проще говоря, то, что предоставляют вам транзакции, является гарантией «все или ничего». То есть, если вы хотите вставить Order в одну таблицу и связанные OrderItems в другую таблицу, вам нужна гарантия того, что если вставка OrderItems завершится неудачно (на шаге 2), изменения, внесенные в таблицы Order (шаг 1), также будут откатиться назад. Таким образом, вы никогда не окажетесь в ситуации, когда строка в таблице Order не имеет связанных строк в элементах Order.

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

В Java вы обычно проводите транзакции примерно следующим образом:

  1. Установите autocommit на false на вашем соединении jdbc
  2. Выполнить несколько вставок и / или обновлений, используя одно и то же соединение
  3. Позвоните conn.commit(), когда все вставки / обновления, которые идут вместе, сделаны
  4. Если во время шага 2 возникла проблема, позвоните по номеру conn.rollback()
...