Транзакции приложений, не связанных с базой данных

Как можно инкапсулировать действия, не связанные с базой данных, в транзакции?

Например, скажем, у меня есть некоторое количество методов / функций, вызываемых последовательно, некоторые обновляют базу данных, некоторые файлы обновления в файловой системе, некоторые параметры обновления в HttpSession, некоторые обновляют кеш и т. Д. Если один из последних не работает, например, при обновлении сеанса, как я могу откатить все другие изменения в файловой системе, в БД и т. д.?

Среда представляет собой контейнер Java Servlet, такой как Tomcat, с чем-то вроде Struts2, любой СУБД, уровнем сохраняемости, таким как Hibernate или Ibatis, и т. Д.


person Valera    schedule 05.10.2011    source источник


Ответы (1)


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

Если в вашем коде нет ошибки, обновление сеанса никогда не должно завершиться ошибкой. Таким образом, вы можете сделать это после того, как другие обновления будут успешными. Следует избегать файловой системы, если вам нужно что-то транзакционное. Альтернативой может быть начало с сохранения в файловой системе, затем обновление базы данных и принятие бесполезных файлов в файловой системе в случае сбоя обновления БД.

person JB Nizet    schedule 05.10.2011