20 | 双会话交错脚本记录卡 | 2026-10-04 条件:独立 javaee_lab 库,PG16;两终端均用 psql -X -v ON_ERROR_STOP=1 -h 127.0.0.1 -U javaee_lab -d javaee_lab 登录,输入本地口令;不要在公用库构造并发锁。先记录 SELECT version(), current_database(), pg_backend_pid(), current_setting('transaction_isolation'); 分别取得两个后端进程 ID。 准备:INSERT INTO purchase_request(tenant_id,status,total) VALUES ('iso-lab-unique','DRAFT',3.50) RETURNING id; 抄下 id;两终端各用 \set request_id <实际 id>。A:BEGIN ISOLATION LEVEL READ COMMITTED; SELECT status,version FROM purchase_request WHERE id=:request_id; 暂停。B:BEGIN; UPDATE purchase_request SET status='SUBMITTED',version=version+1 WHERE id=:request_id AND status='DRAFT'; COMMIT;。A 再 SELECT status,version ...; COMMIT;。预期 A 第二次可见 SUBMITTED;确认 B UPDATE 1。另建一条 DRAFT 样本,把 A 改为 BEGIN ISOLATION LEVEL REPEATABLE READ,对照第二次普通读取仍为 DRAFT。最终从第三连接查状态,勿把旧快照视为终态。 失败合同 NOT_RUN:新增隔离预算示例,两事务分别读合计再各批准不同申请;在 READ COMMITTED/REPEATABLE READ/SERIALIZABLE 下重复受控交错。记录 SQLSTATE 40001 与完整事务回滚/有界重试,校验总预算。以上两会话查询与预算反例均未在本篇执行;不能以场景 09 的单次通过冒充隔离验收。 记录:样本 id/版本、会话 pid、隔离级别、A/B 命令时间与退出码、UPDATE 行数、提交次序、第三连接终态、失败时 SQLSTATE。