Привет,
Если мне нужно обновить две разные строки одновременно, но одна не должна обновляться, если обновление другой не удастся, я сейчас думаю об использовании транзакций.
Но могут ли транзакции выполнять параллельные операции?
В случае, когда мне не нужен результат запроса для выполнения следующего (-ых) запроса (-ов), есть ли способ выполнить запросы одновременно?
Это теоретический вопрос:
Я узнал о блокировках и проблемах конкуренции в реляционной базе данных, ища ответ на свой вопрос, но не нашел того, что искал ...
Заранее благодарим за уделенное время!






Да, это возможно; он называется распределенная транзакция. Он реализован с помощью двухфазная фиксация как в 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.
Ты абсолютно прав. Это, конечно, было больше теоретической концепцией, чем реальностью, где, как мы знаем, нет ничего на 100%. Я перефразирую.