我正在寻找一种在Postgres中管理跨越多个表的乐观并发控制的方法。同时,我也试图将业务逻辑保持在数据库之外。我的一个表设置大致如下:
CREATE TABLE master
(
id SERIAL PRIMARY KEY NOT NULL,
status VARCHAR NOT NULL,
some_value INT NOT NULL,
row_version INT NOT NULL DEFAULT(1)
)
CREATE TABLE detail
(
id SERIAL PRIMARY KEY NOT NULL,
master_id INT NOT NULL REFERENCES master ON DELETE CASCADE ON UPDATE CASCADE,
some_data VARCHAR NOT NULL
)
master.row_version
会在行更新时由触发器自动递增。
客户端应用程序执行以下操作:
- 从
master
表中读取记录。 - 基于记录的值计算一些业务逻辑,这可能需要涉及几分钟的延迟和用户交互。
- 根据步骤2中的逻辑将记录插入到
detail
表中。
如果自第一步读取记录时master.row_version
的值已更改,则希望拒绝步骤3。乐观并发控制似乎是正确的答案(唯一的答案?),但我不确定如何跨两个表管理它。
我考虑使用Postgres中带有master
表相关记录的行级锁的函数可能是解决方法。但我不确定这是我的最佳/唯一选项,或者会是什么样子(我对Postgres语法有点陌生)。
鉴于客户端应用程序是用C#编写的,我正在使用Npgsql。我不知道它是否可以帮助我?如果可能的话,我想避免使用函数,但我无法找到使用纯SQL的方法,而且匿名代码块(至少在Npgsql中)不支持我需要的I/O操作。
SERIALIZABLE
隔离级别? - Snixtor