#database #postgresql #acid
#База данных #postgresql #acid
Вопрос:
Используя postgresql, если пользователь хочет добавить новые данные или обновить существующие данные в базе данных, пока она заблокирована, как решается его транзакция? Давайте рассмотрим этот сценарий и, пожалуйста, поправьте меня, если я в какой-то момент неправильно понимаю:
1. User 1 wants to batch update some records in the database.
2. The transaction from user 1 locks the database until all the updates are pushed.
3. User 2 wants to update something in the database, or insert some new data to the database while it is locked.
4. Based on what MVCC denotes, user 2 is shown the pre-lock version of the database.
5. User 2 inserts or updates the data.
6. User one finishes pushing its transaction and releases the database.
7. There are two versions of database now, the data is resolved.
Как решается проблема на шаге 7? Я где-то читал, что он будет принимать данные с последней глобальной отметкой времени. Но как я могу быть уверен, что это именно те данные, которые она должна сохранить? Если данные от пользователя 2 имеют приоритет над пользователем 1, но транзакция от пользователя 2 завершена раньше пользователя 1, как будет решен этот приоритет? Спасибо за вашу помощь.
Комментарии:
1. PostgreSQL не имеет блокировок на уровне базы данных, поэтому вопрос в том виде, в каком он написан, бессмыслен.
Ответ №1:
Вы не можете заблокировать базу данных в PostgreSQL, но вы можете заблокировать исключительно таблицу. Это то, что вы никогда не должны делать, потому что это не обязательно и вредит параллелизму и процессам обслуживания системы (автовакуум).
Каждая строка, которую вы изменяете или удаляете, будет автоматически заблокирована на время транзакции. Это не влияет на изменение других строк параллельными сеансами.
Если транзакция пытается изменить строку, которая уже заблокирована другой транзакцией, вторая транзакция блокируется и должна ждать, пока не будет выполнена первая транзакция. Таким образом, можно избежать описанного вами сценария.
Комментарии:
1. Таким образом, транзакция, которая изменяет заблокированную строку, будет ждать, пока блокировка не будет снята. Итак, в какой ситуации произойдет откат?
2. Откат происходит, когда вы выполняете
ROLLBACK
команду или сеанс базы данных завершается, пока транзакция все еще открыта.