OneCode
1.39K subscribers
628 photos
59 videos
3 files
524 links
Full Stack на PHP, Laravel и всё, что с этим связано.
YouTube: https://www.youtube.com/@onecode_blog
Download Telegram
Совет дня от дядюшки Макса

При использовании транзакций и блокировок в работе с базой данных старайся получать записи в одинаковом порядке для избежания взаимной блокировки (Deadlock).

Например, мы разрабатываем кошелек, где у пользователей есть финансовые счета (accounts). Пользователь может совершать разные операции со счётом: пополнять (deposit), переводить другому пользователю (transfer) или выводить средства со счёта (payout).

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

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

Пример ошибки: в одной транзакции мы сначала получили и заблокировали счёт (account), а потом получили и заблокировали пополнение (deposit). В другой транзакции мы сделали тоже самое, но наоборот - сначала заблокировали deposit, а потом account. Если обе транзакции запустятся одновременно, то одна сначала заблокирует счёт, а вторая пополнение, затем первая попытается заблокировать пополнение, но оно уже заблокировано второй транзакцией, которая в этот момент пытается заблокировать счёт, который в свою очередь уже заблокирован первой транзакцией.

В такой ситуации успешно завершится только одна из транзакций, а вторая завершится с ошибкой.

Документация на примере PostgreSQL:
https://www.postgresql.org/docs/current/explicit-locking.html#LOCKING-DEADLOCKS

Ставь лайк, если полезно 👍 делись своим опытом в комментариях!

#db #deadlock #tip
👍14