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

Привет,

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

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

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

Это теоретический вопрос:

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

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

Заранее благодарим за уделенное время!

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
2
0
1 074
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Да, это возможно; он называется распределенная транзакция. Он реализован с помощью двухфазная фиксация как в MySQL, так и в PostgreSQL (и во всех СУБД, о которых я когда-либо слышал).

Идея состоит в том, что вы запускаете транзакции в двух одновременных сеансах базы данных. Когда вам нужно откатить одну транзакцию, вы откатитесь и другой.

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

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

После того, как все транзакции были успешно подготовлены, вы их фиксируете. Это никогда не должно закончиться неудачей, поскольку вся «тяжелая работа» уже была проделана во время подготовки.

Вам нужен компонент, который координирует эту работу. Этот компонент называется менеджер транзакций и должен сохранять состояние каждой транзакции, чтобы он мог продолжать обработку, даже если работа была прервана из-за сбоя или чего-то еще. Этот компонент обеспечивает фиксацию или откат всех транзакций.

Операторы 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.

"... последующая фиксация гарантированно сработает" PostgreSQL этого не гарантирует. Он просто предлагает "... очень высокую вероятность того, что это может быть успешно совершено ...
Mike Sherrill 'Cat Recall' 17.05.2018 21:31

Ты абсолютно прав. Это, конечно, было больше теоретической концепцией, чем реальностью, где, как мы знаем, нет ничего на 100%. Я перефразирую.

Laurenz Albe 18.05.2018 08:23

Другие вопросы по теме