【发布时间】:2022-01-21 21:43:55
【问题描述】:
我正在尝试在 express 服务器中使用带有 graphql 的 postgresQL。
我面临的问题是当用户在客户端调用 API 时我想更新数据库的值。短时间调用两次,由于用户的钱和产品的数量还没有更新,这两个函数都会得到一些钱,执行,产品的数量和用户的钱都是负数,这是不正确的。
什么是锁功能的简单实现,使特定用户的数据行和产品的数据行在前一个过程完成之前无法访问和修改,从而实现线程安全?
编辑:我知道我可以在本地缓存中添加一个锁,但我想问一下典型的句柄方法是什么?比如我会在进程被锁定时返回正在运行的进程?或者我只是创建一个循环来等待第一个请求完成?如果有任何好的代码示例,我可以继续学习。
@Mutation(() => Boolean)
async pay(@Arg('amount') amount: number) {
let userId = 1
let proeductId = 1
const user = await User.findOne(userId); // user = {userId: 1, money: 50}
const product = await Product.findOne(userId); // product= {userId:1, quantity: 1, price: 50}
await new Promise(resolve => setTimeout(resolve, 3000)) // some logic
if(user && product && user?.money >= product.price && product.quantity > 0 ){
await getConnection().getRepository(User).decrement({ userId }, 'money', 50);
await getConnection().getRepository(product).decrement({ userId }, 'quantity', 1);
}
}
}
【问题讨论】:
-
选择更新并让您的应用程序在遇到锁定时失败/等待。
标签: database postgresql express thread-safety locking