gpt4 book ai didi

mysql - 我是否需要担心给定场景中更新操作中同时请求的影响

转载 作者:可可西里 更新时间:2023-11-01 07:07:49 24 4
gpt4 key购买 nike

想象一下这种情况,我有一个网站,用户通过出售他们的元素或点击广告等事件获得信用,或者任何我的用户表都是这样的

users : id , username , credit 
15 , alex , 1000
16 , jack , 1500

所以现在用户可以请求以某种支付方式提取他们的信用我的提款表将是这样的

withdraws : 
id , user_id , amount
1 , 15 , 500
2 , 16 , 100

我必须从他们的信用额度中减去取款额......我喜欢用触发器来做这件事

CREATE TRIGGER  withdraw
BEFORE INSERT
ON withdraws
FOR EACH ROW
BEGIN

UPDATE users SET credit = credit-NEW.amount WHERE id = NEW.user_id;
END $$

并确保用户不会在取款过程中以负信用结束,我有这个触发器(诅咒我也会在代码逻辑中检查它)

CREATE TRIGGER  update_user
BEFORE UPDATE
ON users
FOR EACH ROW
BEGIN

IF NEW.credit < 0 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'invalid credit error';
END IF;


END $$

现在我的问题是,是否可能有人故意或由于某种服务器错误而同时发送多个取款请求,并且取款超过他的信用额....如果是这样,我该如何防止这种情况发生?

我是否需要在每次撤回插入或类似操作之前锁定用户表?

更新:如果我要锁定用户行并在整个操作中使用事务包装器......似乎是合理的,但触发器如何适应?我的意思是显然我必须开始交易并在代码中完成/提交它(因为我讨厌存储过程并且从不使用它们)这是否意味着我必须放弃触发器并在代码中进行减法或者以某种方式触发发生尽管在不同的平台/地点开始/执行,但内部交易

最佳答案

我会通过意向锁来解决这个问题。看一个例子here我写的。那里叙述了交易 block 的第 1 行到第 5 行之间发生的情况以及其他相关信息。

您自然不会像该示例中那样获得增量器。相反,您的代码将尽可能快地执行更新并执行提交。

该代码可以属于任何地方,而不仅仅是存储过程中。它可以是事件或触发器。数据库引擎(例如 INNODB)是您确保两个人不能同时进入该锁的机制。如何编写与此相关的代码取决于您。

关于mysql - 我是否需要担心给定场景中更新操作中同时请求的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40076516/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com