关于 mysql 并发的问题又来了

2022-04-03 18:54:19 +08:00
 Features
要扣除用户余额 100 ,以前大学学过一点 java EE,正常就是
1.SELECT `余额` FROM user;
2.余额 >= 100 则 UPDATE
3.否则提示用户余额不足

现在请求并发太高,查询的余额还没来得及更新,导致超扣了

我目前的解决办法:
1.把扣除余额请求放到自己实现的 redis 队列里
2.使用一个 thread 定时轮询队列,多 thread 我怕又出现并发问题,0.5s 轮询一次,处理过程中停止轮询
保证只有一个线程在处理数据
3.客户端开个 socket 连接,做一些加载动画,等待跳转的动作,等 socket 更新数据

我感觉这样就很不优雅
有什么能在 mysql 层面解决这个问题的吗?
3481 次点击
所在节点    MySQL
28 条回复
liangkang1436
2022-04-03 22:09:24 +08:00
@Features 你先去谷歌一下事务的基础知识,比如什么是 acid ,然后再去查一下 MySQL 的事务相关的配置和 SQL 写法,然后你就知道怎么走了
CEBBCAT
2022-04-04 01:39:34 +08:00
你的学习方式是不是有问题?上次的问题 /t/844048 就已经在 MySQL 工作原理上大错特错了,这个帖子又是一样地,只讲问题,只求解决,不讲原理

强烈建议你找一本正儿八经的,偏实战方向的书学习一下。等下我可以帮你找一些

很抱歉,最近精力不足,不能更 friendly 地回复你的帖子。

如果你有问题,请先去 Google 过再来问!请不要把 BBS 当成可以随便发言的 IM 聊天软件。请阅读《提问的智慧》。

根据我的视角,你总是拿一些初学者教程就会教授的东西来问,这不必要
CEBBCAT
2022-04-04 01:56:56 +08:00
@CEBBCAT 你可以找找看《疯狂 Java 讲义》,我没有读过它,但我看到他的目录里面涉及了 MySQL 以及对应的事务部分。另外对于初学者来说通过培训班的视频学习也是一种方式,而且也是更为直观的方式。

假如你能耐得下心,以及有时间,去按照传统的计算机原理、操作系统、数据结构去学习,那再好不过了
Evilk
2022-04-04 15:17:24 +08:00
如果是 mysql
先开启事务
根据主键 ID 锁住这行数据
再进行相关操作
最后再提交事务

我最近正好在做这种需求
测试过并发
没有出现超扣的情况

我之前也像你一样,从其他方面来做
却忘了数据库本身就很擅长这种业务
gjquoiai
2022-04-04 17:22:22 +08:00
@CEBBCAT #22 感谢指路,看了看这两个帖子,低血压已经治好了
huangzhe8263
2022-04-04 18:42:06 +08:00
这种入门级的问题,还是好好补一下基础好。
现在还是能发现 bug 的,万一往里头埋了啥大漏洞进去
那就不是,来论坛问,能解决的了
iseki
2022-04-04 23:08:25 +08:00
@Features 事务虽然会并发执行,但会按照设定的隔离等级,利用锁和多版本记录等机制保证正确处理你面对的这种问题,最严格的 Serializable (可序列化)隔离等级理论上会保证执行结果和看起来一个一个非并发的执行完全一致(当然只是理论上,实际中不同的数据库在一些细节上还是会有些不同的偏差,需要查阅数据库文档,不过感觉你现在不需要关心这些)。
具体比如如下这个例子:

```sql
select 账户 ID, 余额 from table_name where 余额 >= 100;
update table_name set 余额 = xxxxx where 账户 ID = xxx;
```

在( PostgreSQL 数据库中)隔离等级为 RR 或 SI 时,慢一步的会话可能会在 update 时报错,事务 rollback 。MySQL 在 RR 下不会报错失败(Lost update) 但在 SI 下也会不能提交。

(所以 PostgreSQL 好!:)
veightz
2022-04-05 01:55:56 +08:00
一般来说,改余额还要配合流水表的,直接一张余额表该值,后面会很痛苦….

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/844768

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX