Есть ли хороший способ выполнять операторы MySQL атомарно через JDBC? - PullRequest
2 голосов
/ 11 мая 2010

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

Например, (это довольно глупый пример, но он иллюстрирует точку зрения, которая так важна для меня), предположим, что я хочу отредактировать все записи в столбце «имя», чтобы они были прописными. По какой-то причине я хочу, чтобы либо ВСЕ имена имели правильную заглавную букву, либо НИКТОР из них не имел надлежащей заглавной буквы (а исходное состояние таблицы - то, что НИЧЕГО из них нет).

Существует ли уже реализованный способ запуска пакетного обновления для таблицы и уверенности в том, что в случае сбоя любого из обновлений все изменения будут отменены, а таблица останется неизменной?

Я могу придумать несколько способов сделать это вручную (хотя предложения приветствуются), но было бы неплохо, если бы был какой-то метод, который я мог бы использовать, который бы работал таким образом. Я посмотрел на команду java.sql.statement.executeBatch(), но документация не убедила меня, что моя таблица не изменится, если она каким-то образом выйдет из строя.

1 Ответ

8 голосов
/ 11 мая 2010

Я тоже столкнулся с этим при запуске с JDBC - мне показалось, что это противоречит тому, что я понял о базах данных и гарантиях ACID.

Прежде чем начать, убедитесь, что ваш движок хранения MySQL поддерживает транзакции.MyISAM не поддерживает транзакции, но InnoDB поддерживает.

Затем обязательно отключите JDBC autoCommit - Connection.setAutoCommit(false), иначе JDBC будет выполнять каждый оператор как отдельную транзакцию.Коммит будет делом «все или ничего» - частичных изменений не будет.Затем вы запускаете различные операторы обновления и, наконец, вызываете Connection.commit() для подтверждения транзакции.

Подробнее о транзакциях JDBC см. В Sun Tutorial .

Использование пакета не меняет гарантии ACID - вы либо оперированы, либо нет!- Пакетирование - это скорее сбор нескольких операторов для повышения производительности.

...