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

У нас есть внешний веб-сервис, который предоставляет пару API lock и unlock. Ниже приведены шаги, выполняемые при сохранении значений в нашей системе.

try 
  call lock
  save changes in single DB transaction
catch user_defined_exception
  call unlock

В случае, если есть какое-либо время ожидания транзакции, мы не будем вызывать unlock, так как это исключение времени ожидания не считается частью определенных пользователем исключений. Также в будущем могут быть введены любые новые исключения, мы не хотим включать все эти исключения и делаем разблокировку.
Мы ищем промышленный стандарт/шаблон для координации транзакций между сервисом и транзакциями базы данных.
Наше приложение построено на java, а база данных Sybase ASE. Любые подсказки приветствуются.


person sundar    schedule 25.02.2013    source источник
comment
Sybase — это компания, а не база данных. Какой продукт Sybase вы имеете в виду (ASE, ASA, IQ)?   -  person Michael Gardner    schedule 25.02.2013
comment
@MichaelGardner Обновил мой вопрос. Спасибо за вашу поправку.   -  person sundar    schedule 26.02.2013


Ответы (1)


рекомендуемая практика для правильной блокировки с исключениями в Java следующее:

lock();
try {
  doStuff();
} finally {
  unlock();
}

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

Стандартом координации между службами и базами данных является WS-AT. Любой сервер приложений Java должен поддерживать его, связываться с JTA и с двухфазной фиксацией в самой базе данных. При настройке подключения к базе данных на сервере приложений обязательно выберите параметр XADataSource.

person jop    schedule 26.02.2013
comment
На самом деле я ожидаю, что разблокировка произойдет только в том случае, если есть какое-либо исключение. Но ваш псевдокод разблокируется, хотя исключений нет вообще. Я попытаюсь изучить ваше предложение относительно WS-AT. - person sundar; 26.02.2013