MySQL / PostgreSQL - возможно ли выполнить параллельную запись в транзакции? - PullRequest
0 голосов
/ 17 мая 2018

Привет,

Если мне нужно обновить две разные строки одновременно, но одна не должна обновляться, если не удается обновить другую, мое текущее мышление заключается в использованиитранзакции.

Но могут ли транзакции выполнять параллельные операции?

В случае, если мне не нужен результат запроса для выполнения следующего (-ых) одного (-их),способ выполнения запросов одновременно?

Это теоретический вопрос, поэтому:

  • Строки не обязательно должны быть в одной таблице
  • Операцииможет быть обновление, вставка или удаление (в одной и той же таблице вставка обрабатывается последовательно, но во многих разных таблицах?)
  • Решение не обязательно должно быть в SQL (может быть, есть способ получитьсвоего рода «барьерная транзакция» от клиента, а затем асинхронно выполнять запросы?)

Я узнал о блокировках и проблемах параллелизма в реляционной базе данных, ища ответ на свой вопрос, но не сделалнашел то, что я искалза ...

Заранее спасибо за потраченное время!

1 Ответ

0 голосов
/ 17 мая 2018

Да, это возможно; она называется распределенной транзакцией . Он реализован с двухфазной фиксацией в 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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...