2013-02-25 3 views
1

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

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

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

+1

Sybase - это компания, а не база данных. Какой продукт Sybase вы имеете в виду (ASE, ASA, IQ)? –

+0

@MichaelGardner Обновлен мой вопрос. Спасибо за исправление. – sundar

ответ

1

recommended practice для правильной фиксации с исключениями в Java заключается в следующем:

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

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

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

+0

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

Смежные вопросы