2009-09-30 3 views
3

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

Update table T1 in database server S1 
Update table T2 in database server S2 

И я хочу выше единицы работы происходить либо полностью, либо вообще ни (как случай с любой транзакцией базы данных). Как я могу это сделать? Я искал экстенсивно и нашел это post близко к тому, что я ожидаю, но это, по-видимому, очень специфично для Hibernate.

Я использую Spring, iBatis и Tomcat (6.x) в качестве контейнера.

+0

Решение на основе FOSS было бы очень полезно. – peakit

+0

JBoss Transaction Manager является открытым исходным кодом и может использоваться без использования всего контейнера JBoss. – SteveD

+0

И обе ваши базы данных должны поддерживать XA - не все делают, и их уровень стабильности/функциональности может быть причиной беспокойства. – SteveD

ответ

6

Это действительно зависит от того, насколько надежным является решение, которое вам нужно. Минимальный уровень надежности в этом случае - транзакции XA. Чтобы использовать это, вам нужна база данных и драйвер JDBC, который поддерживает его для стартеров, тогда вы можете настроить Spring на использование (here - это схема).

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

Редактировать: Я имею в виду, что все данные помещаются в одну базу данных. Для этой цели либо первая база данных, либо другая база данных. Эта база данных по существу станет очередью, из которой будет загружен окончательный вид данных. Запись в эту базу данных (при условии получения достойного продукта базы данных) будет завершена или полностью завершится. Затем отдельный поток опросает эту базу данных и распространяет любые отсутствующие данные в другие базы данных. Поэтому, если процесс завершится неудачно, когда этот поток снова запустится, он продолжит процесс распространения. Данные могут отсутствовать в каждом месте, где вы хотите, сразу же, но ничего не потерялось.

+0

«Если XA недостаточно для вас, то то, что вам действительно нужно сделать, это поместить все данные в одну базу данных, а затем разделить его на отдельный процесс». Не могли бы вы объяснить это? Что вы подразумеваете под «помещением всех данных в одном месте» и «раздельным процессом»? – peakit

2

Требуется менеджер распределенных транзакций. Мне нравится использовать Atomikos, который можно запустить в JVM.

+0

Является ли он бесплатным и открытым исходным кодом? – peakit

+0

@peakit, глядя на свой сайт, у них есть бесплатная (регистрация, необходимая для скачивания), версия Apache 2.0 и более продвинутая версия с закрытым исходным кодом. – Yishai

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