Реальная разница между однофазным и двухфазным (XA) фиксацией

Может ли кто-нибудь прояснить разницу между однофазным и двухфазным фиксацией. Насколько я понимаю, однофазная фиксация представляет собой фиксацию в ходе сервера приложений (Service method → EntityManager), а фиксация XA - это одна и та же транзакция до базы данных (Service method → EntityManager → DB) и используется по порядку для правильной откат общей транзакции. Итак, почему мы не используем драйверы XA по умолчанию? Это просто проблема производительности? Пожалуйста, поправьте меня, если я ошибаюсь.

Ответ 1

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

Однофазный коммит

BEGIN
   INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
      VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00 );
   INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
      VALUES (2, 'Khilan', 25, 'Delhi', 1500.00 );
COMMIT;

Это классическая атомарная транзакция, написанная на PL/SQL (для мира Java EE, представьте себе метод EJB, который также может быть транзакционным), есть только одна фаза, когда все действия выполняются и выполняется либо фиксация, либо откат.

Двухфазный коммит

//pseodocode
BEGIN
    UPDATE db1; //updates DB on another machine
    UPDATE someCloudStorage; //update something on the cloud
    INSERT INTO SomeTable VALUES(...);
COMMIT;

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

Обратите внимание, что если вы хотите использовать транзакции XA в Java, вам потребуется драйвер JDBC с поддержкой XA (и правильно настроенным источником данных XA).