锁定postgres中有共同问题的多个事务的最有效/最推荐的方法是什么



我正在开发库存管理软件。该数据库使用RLS来允许多个客户端使用同一数据库。因此,每张桌子都有一个";客户端ID";柱当扫描库存时;"活动""保留";或";传入";州。

活动=准备使用,保留=临时保留,因为订单可能会收到(但可能会被取消(,并且进货=订购库存

这些状态会在不同的时间点进行调整——销售、收到的货物、库存更新等。我想知道如何最好地避免数据不一致。我想做的基本上是告诉postgres">为具有匹配SKU XXX的行的客户端X锁定该表,同时我运行整个事务";但我不知道怎么做。

听起来你需要一个客户/SKU组合表,然后每个做需要序列化的事情的人都必须首先锁定该表中的相关行。或者,如果你不想永久列举所有可能的客户/SKU组合,你可以随时进行:

create table customer_sku_lock (customer_id int, sku text, primary key (customer_id, sku));

然后

BEGIN;
insert into customer_sku_lock values (4, 'DEADBEEF'); --get lock
delete from customer_sku_lock where customer_id=4 and sku='DEADBEEF'; --set up to release lock upon commit
-- do stuff here
COMMIT; 

在INSERT之后立即执行DELETE似乎违反直觉,但它确实可以串行化内容,这样DELETE就不太可能被遗忘。为了获得额外的健壮性,您甚至可以将INSERT和DELETE打包为一个函数调用,并赋予函数定义者权限,并使锁表只能由函数所有者访问。

相关内容

最新更新