Зафиксируйте одно значение атрибута, а не всю транзакцию - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть Java-программа, которая много взаимодействует с БД (оракул), которая запускается одной транзакцией. Мне нужно обновить столбец, скажем, Y какой-нибудь таблицы, скажем, X, и это должно быть зафиксировано, но не вся транзакция.

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

Значение этого столбца необходимо для обработки одновременного вызова программы.

Ответы [ 5 ]

0 голосов
/ 15 ноября 2018

С голым JDBC, новое соединение, о котором говорил Мартин Шапендонк, - это путь.

При использовании Spring будет доступно Распространение # REQUIRES_NEW для Транзакционная аннотация .Аналогично, с EJB можно использовать TransactionAttributeType # REQUIRES_NEW .

0 голосов
/ 15 ноября 2018

Автономные транзакции - хороший совет. Однако вы также можете открыть второе соединение в вашей Java-программе. Обработка обновлений / фиксаций в одном соединении и основной транзакции в другом.

0 голосов
/ 15 ноября 2018

Почему вы не можете просто запустить другую транзакцию для выполнения "внутренней" работы. Оставьте текущую транзакцию запущенной и используйте новую транзакцию для выполнения дополнительной работы.

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

0 голосов
/ 15 ноября 2018

Мне нужно обновить столбец, скажем, Y некоторой таблицы, скажем, X, и что это должно быть зафиксировано, но не вся транзакция.

Вы можете выполнить обновление X в автономная транзакция .

CREATE PROCEDURE updateXofY(
  in_id IN X.ID%TYPE,
  in_y  IN X.Y%TYPE
)
AS
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  UPDATE X
  SET   Y  = in_y
  WHERE id = in_id;
  COMMIT;
END updateXofY;
/

После вызова процедуры она обновит столбец Y таблицы X и COMMIT автономную транзакцию без фиксации вызывающей транзакции.

Недостатком этого является то, что автономная транзакция COMMIT ted, так что если вы ROLLBACK основная транзакция, то это не будет ROLLBACK автономной транзакцией (так как она автономна).

0 голосов
/ 15 ноября 2018

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

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