如何在 postgresql 中解决对锁定数据库的更新查询?

How is an update query on a locked database resolved in postgresql?

使用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 之前完成,这个优先级将如何解决?感谢您的帮助。

您不能在 PostgreSQL 中锁定数据库,但可以独占锁定 table。这是你不应该永远做的事情,因为它没有必要并且会损害并发性和系统维护过程(autovacuum)。

您修改或删除的每一行都将在交易期间自动锁定。这不影响并发会话对其他行的修改。

如果一个事务试图修改一个已经被另一个事务锁定的行,则第二个事务被阻塞并且必须等到第一个事务完成。这样就避免了你描述的场景。