Многокомандный SQL-вопрос об атомарности - PullRequest
3 голосов
/ 23 ноября 2010

Я пытаюсь создать программу, которая обновляет 2 разные таблицы с помощью команд sql. Единственное, что меня беспокоит, это то, что если программа обновляет одну из таблиц, а затем теряет соединение или что-то еще и НЕ обновляет другую таблицу, это может быть проблемой. Есть ли способ, которым я мог бы либо

A. Обновите их в одно и то же время

или

B. Вернуть первое обновление, если второе не удалось.

Ответы [ 3 ]

8 голосов
/ 23 ноября 2010

Да, используйте транзакцию SQL.Вот учебник: Транзакции JDBC

2 голосов
/ 23 ноября 2010

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

  • MySQL
  • Oracle
  • SQL Server
  • PostgreSQL

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

1 голос
/ 23 ноября 2010

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

START TRANSACTION;
 *do stuff*
COMMIT;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...