逻辑是我现在有个商品 数量是2个,然后我去买一个商品,然后数量变为1,在有并发的情况是有可能数量为0了,这时候购买就会有问题,所以说我选择加锁,但加了锁我又有了新的问题。我现在有2个终端来模拟并发
加锁首先要
set autocommit=0;
begin
然后查询
select * from products where id=1 for update;
+----+----------+
| id | quantity |
+----+----------+
| 1 | 2 |
+----+----------+
1 row in set (0.00 sec)
得到数量为2,这时候去更新
update products set quantity=1 where id=1;
然后这时候我们去2号终端查询
select * from products where id=1 for update;
结果依然是
+----+----------+
| id | quantity |
+----+----------+
| 1 | 2 |
+----+----------+
1 row in set (0.00 sec)
那我想知道,其实1号终端已经执行了update,但是还没有执行 commit work,那这时候2号终端如果去update的话,会误以为数量还是为2,其实这时候应该已经变成了1了,想问下怎么解决这种问题
给几点思路:
设置mysql隔离级别,设置成read commit(可提交读),效果是可以在当前事物看到其他事物提交的结果,总共有四个,可以去百度。
加快速度,加快速度,加快速度。(可用redis的消息队列,redis内置了各种数据类型和数据结构)
用mysql的消息队列
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。