Ответ 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).