The PostgreSQL manual page可串行化隔离级别状态:

[与]可重复读取级别类似,使用此级别的应用程序必须做好准备,以便在序列化失败时重试事务.

在可重复读取或可序列化级别遇到序列化失败的条件是什么?

我试图在两个psql的实例运行时引发序列化失败,但即使一个实例提交了一个事务,另一个实例在可序列化级别事务中成功提交了其更改,而另一个实例在可序列化级别事务中提交了更改.两者都只是将记录插入表中,所以我可能需要try 更复杂的方法.

基本上,我试图了解序列化失败时会发生什么,以及序列化失败是如何发生的.

推荐答案

对于REPEATABLE READ,这个例子可以:

准备阶段:

psql-0> CREATE TABLE foo(key int primary key, val int);
CREATE TABLE
psql-0> INSERT INTO foo VALUES(1, 42);

现在请注意psql-X部分,该部分指示操作的交错:

psql-1> BEGIN ISOLATION LEVEL REPEATABLE READ;
psql-1> UPDATE foo SET val=val+1;
UPDATE 1
psql-2> BEGIN ISOLATION LEVEL REPEATABLE READ;
psql-2> UPDATE foo SET val=val+1;
*** no output, transaction blocked ***

psql-1> COMMIT;

psql-2> *** unblocks ***
ERROR:  could not serialize access due to concurrent update

PostgreSQL 9.1的文档中有一个SERIALIZABLE的例子,在这里应该没有问题.

Postgresql相关问答推荐

函数返回查询执行plpgsql时不存在列

使用PGx在围棋中执行多条SQL语句

sqlalchemy在Flask 下运行时出现无法解释的错误

在 Postgres 中,部分索引比普通索引需要更多的时间和成本来执行

gorm 创建并返回值 many2many

Postgresql:创建默认表空间的视图和使用?

try 访问本地主机中的数据库时如何解决Error: The server does not support SSL connections?

在执行 postgresql 函数时提交事务

Select 日期最高的行

从 psycopg2 异常中获取错误消息

查询仅属于特定部门的用户

避免 created_at 和 updated_at 由 sequelize 自动生成

Python PostgreSQL 模块.哪个最好?

在 Windows 7 上更改/重置 postgresql 用户密码

postgres regexp_replace 只想允许 a-z 和 A-Z

我应该在 Django DATABASE ENGINE 中使用哪个 Postgres 值?

PostgreSQL 无法启动:server.key具有组或世界访问权限

在 Flask-sqlalchemy 和 Postgresql 中使用 JSON 类型

在 Select (PostgreSQL/pgAdmin) 中将布尔值返回为 TRUE 或 FALSE

postgresql NOT ILIKE 子句不包含空字符串值