Обработка транзакций, охватывающих серверы баз данных


У меня есть сценарий, где единица работы определяется как:

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

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

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

2 ответа:

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

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

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

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