postgresql - PostgreSQL 中的 INSERT 和事务序列化

标签 postgresql transactions isolation-level

我有一个问题。事务隔离级别设置为可序列化。当一个用户打开事务并在“table1”中插入或更新数据,然后另一个用户打开事务并尝试将数据插入同一个表时,第二个用户是否需要等待“直到第一个用户提交事务?

最佳答案

一般不会。第二个事务只是插入,所以除非需要进行唯一索引检查或其他触发器,否则可以无条件地插入数据。在唯一索引(包括主键)的情况下,如果两个事务都更新具有相同值的行,它将阻塞,例如:

-- Session 1                           -- Session 2
CREATE TABLE t (x INT PRIMARY KEY);
BEGIN;
INSERT INTO t VALUES (1);
                                       BEGIN;
                                       INSERT INTO t VALUES (1);  -- blocks here
COMMIT;
                                       -- finally completes with duplicate key error

在可能影响其他事务插入的更新的情况下,事情就不那么明显了。我知道 PostgreSQL 在这种情况下还不支持“真正的”可串行化。我不知道其他 SQL 系统对它的支持有多普遍。

参见 http://www.postgresql.org/docs/current/interactive/mvcc.html

关于postgresql - PostgreSQL 中的 INSERT 和事务序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3011260/

相关文章:

ruby-on-rails - 如何使用 Rails/ActiveRecord 将 postgreSQL 中的主键类型更改为 bigserial

python - 在Django中,如何实现一个事务的可重复读?

database - 不可重复读和幻读有什么区别?

Django + PostgreSQL : Fill missing dates in a range

PostgreSQL:为什么 random() 在连接中不起作用?

postgresql - 连接本地主机 Postgres 数据库

jakarta-ee - BMT/CMT 和应用程序/容器管理的 EntityManager 之间有什么关系?

grails - 什么是 Grails "transactional"服务?

transactions - 如何在 authorize.net 沙盒中结算付款?

java - JPA 和 MySQL 事务隔离级别