Да, это возможно; она называется распределенной транзакцией . Он реализован с двухфазной фиксацией в MySQL и PostgreSQL (и в каждой СУБД, о которой я когда-либо слышал).
Идея состоит в том, что вы запускаете транзакции в двух одновременных сеансах базы данных. Когда вам необходимо выполнить откат в одной транзакции, вы также откатитесь в другой.
Как только вы закончите свою работу, вы подготовите обе транзакции. Это особый процесс, который выполняет всю работу за исключением фактической фиксации, так что гарантируется работа последующей фиксации. Кроме того, такая подготовленная транзакция должна быть сохранена, чтобы она могла пережить сбой.
Если на этапе подготовки в базе данных произошел сбой, вы откатите обе транзакции.
Как только все транзакции были успешно подготовлены, вы их фиксируете. Это никогда не должно потерпеть неудачу, так как вся тяжелая работа & ldquo; было уже сделано во время подготовки.
Вам нужен компонент, который координирует эту работу. Этот компонент называется диспетчер транзакций и должен сохранять состояние каждой транзакции, чтобы он мог продолжить обработку, даже если работа была прервана из-за сбоя или чего-то еще. Этот компонент обеспечивает фиксацию или откат всех транзакций.
Операторы SQL для этого различаются в PostgreSQL и MySQL:
| PostgreSQL | MySQL
----------+----------------------------+--------------------
start | BEGIN | XA START
prepare | PREPARE TRANSACTION <name> | XA PREPARE <name>
commit | COMMIT PREPARED <name> | XA COMMIT <name>
rollback | ROLLBACK PREPARED <name> | XA ROLLBACK <name>
См. Документацию для PostgreSQL и MySQL .