Обеспечение целостности данных при доступе к базе данных несколькими клиентами Java - PullRequest
1 голос
/ 21 сентября 2011

У меня есть один экземпляр базы данных MySql с таблицей Account , которая поддерживает поле Balance .У меня есть несколько Java-приложений, каждое из которых использует Jdbc для подключения к базе данных, что может потенциально увеличить или уменьшить значение поля Balance .Как мне убедиться, что значение Balance прочитано, рассчитано и обновлено, и что этот процесс происходит изолированно и «осведомлен» о любых других процессах Java, которые могут выполнять то же самое?

Ответы [ 3 ]

5 голосов
/ 21 сентября 2011

Простой ответ - использовать транзакции: http://dev.mysql.com/doc/refman/5.0/en/commit.html

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

2 голосов
/ 21 сентября 2011

Один простой подход - управление транзакциями JDBC. См. java.sql.Connection.setAutoCommit() документацию. Это позволяет вам явно отключить автоматическую фиксацию операторов:

Connection c = /* retrieve connection */
c.setAutoCommit(false);
c.setTransactionIsolation(/* depends on your requirements */);
c.executeQuery(/*  */);
c.executeUpdate(/*  */);
c.commit(); /* or c.rollback() */

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

Редактировать: Если ваши Java-приложения являются клиентами конечных пользователей, вы всегда рискуете, чтобы пользователи напрямую подключались к базе данных (например, используя Access), минуя логику управления транзакциями. Это одна из причин, по которой мы начали размещать серверы приложений между ними. Решением также может быть реализация хранимой процедуры, чтобы клиенты вообще не взаимодействовали с таблицами.

1 голос
/ 21 сентября 2011

Если вы используете движок InnoDB, то вы можете использовать Блокировка уровня записи MySQL для блокировки определенной учетной записи для обновлений от других клиентов.

ОБНОВЛЕНИЕ: АльтернативноВы можете использовать блокировки уровня приложения, описанные здесь .

...