2019/04/01 17:18
redis的库存什么时候同步到DB
2019/04/01 13:40
为什么加库存的时候不用lua
2018/07/03 09:04

引用来自“winston952”的评论

你更新库存的时候 为啥还要加锁呢?你听过lua脚本 不是具有原子性了嘛
不好意思 看错了
2018/07/01 20:35
你更新库存的时候 为啥还要加锁呢?你听过lua脚本 不是具有原子性了嘛
2018/02/01 09:47

引用来自“xiaolyuh”的评论

引用来自“沧海_Sea”的评论

引用来自“xiaolyuh”的评论

引用来自“xiaolyuh”的评论

引用来自“沧海_Sea”的评论

update number set x=x-1 where x > 0
mysql 的事务隔离级别是 repeatable read 这个 sql 更新库存肯定会出问题

@沧海_Sea 更新的时候会加排他锁啊,加了排他锁更新就是串行执行的了。为什么会有问题呢!

引用来自“沧海_Sea”的评论

read commit 事务隔离级别没问题 但是 repeatable read 下, 会有幻读的情况

引用来自“xiaolyuh”的评论

是不是这样子的,假如库存是5,有A、B两个请求分别创建了事务并且都没有提交,当A事务提交了,改了库存是5,但是因为是事务隔离级别是可重复读的,所有B看不到A事务改的库存。到时B看到的库存还是5,所以出现了超扣的问题?

引用来自“沧海_Sea”的评论

是的 可以修改隔离级别为 read commit 或者在事务开启之前使用redis加锁

引用来自“xiaolyuh”的评论

这个我写代码测试了 但是怎么没有出现超扣问题?

引用来自“沧海_Sea”的评论

可能是测试方式有问题吧

引用来自“xiaolyuh”的评论

我开启了两个mysql客户端,将他们的自动提交关掉了。在A客户端执行更新,提交后怎么马上就能在B客户端查询到啊,按道理B客户端是可重复读的不因该能看到更改啊

引用来自“沧海_Sea”的评论

1 自动提交关掉
2 A 客户端查询
3 B 客户端查询
4 A 客户端更新
5 B客户端查询
在第5步确实查不到第4步的更新,但是如果这样:
6 A客户端提交
7 B客户端查询 这个时候还是查不到第4步跟新的数据
8 B客端更新
9 B客户端查询 这个时候看到的库存是扣了两个的。没有超扣

所以我认为可重复读是针对读的,因为mysql是基于多版本并发控制的,在更新的时候他会去先去插入一条数据并将这条数据的创建版本号设置成当前事务版本号,将当前事务版本号设置成老数据的删除版本号。所以不会有超扣的问题

@xiaolyuh 刚才试了下,确实是这样子的��丢人了

@沧海_Sea大家相互探讨相互学习罢了,不存在丢不丢人
上次估计是测试有问题 我刚试了下 select for update , update 都是取的实际值 不会有影响
2018/01/31 23:41

引用来自“沧海_Sea”的评论

引用来自“xiaolyuh”的评论

引用来自“xiaolyuh”的评论

引用来自“沧海_Sea”的评论

update number set x=x-1 where x > 0
mysql 的事务隔离级别是 repeatable read 这个 sql 更新库存肯定会出问题

@沧海_Sea 更新的时候会加排他锁啊,加了排他锁更新就是串行执行的了。为什么会有问题呢!

引用来自“沧海_Sea”的评论

read commit 事务隔离级别没问题 但是 repeatable read 下, 会有幻读的情况

引用来自“xiaolyuh”的评论

是不是这样子的,假如库存是5,有A、B两个请求分别创建了事务并且都没有提交,当A事务提交了,改了库存是5,但是因为是事务隔离级别是可重复读的,所有B看不到A事务改的库存。到时B看到的库存还是5,所以出现了超扣的问题?

引用来自“沧海_Sea”的评论

是的 可以修改隔离级别为 read commit 或者在事务开启之前使用redis加锁

引用来自“xiaolyuh”的评论

这个我写代码测试了 但是怎么没有出现超扣问题?

引用来自“沧海_Sea”的评论

可能是测试方式有问题吧

引用来自“xiaolyuh”的评论

我开启了两个mysql客户端,将他们的自动提交关掉了。在A客户端执行更新,提交后怎么马上就能在B客户端查询到啊,按道理B客户端是可重复读的不因该能看到更改啊

引用来自“沧海_Sea”的评论

1 自动提交关掉
2 A 客户端查询
3 B 客户端查询
4 A 客户端更新
5 B客户端查询
在第5步确实查不到第4步的更新,但是如果这样:
6 A客户端提交
7 B客户端查询 这个时候还是查不到第4步跟新的数据
8 B客端更新
9 B客户端查询 这个时候看到的库存是扣了两个的。没有超扣

所以我认为可重复读是针对读的,因为mysql是基于多版本并发控制的,在更新的时候他会去先去插入一条数据并将这条数据的创建版本号设置成当前事务版本号,将当前事务版本号设置成老数据的删除版本号。所以不会有超扣的问题

@xiaolyuh 刚才试了下,确实是这样子的��丢人了

@沧海_Sea大家相互探讨相互学习罢了,不存在丢不丢人
2018/01/31 20:09

引用来自“xiaolyuh”的评论

引用来自“xiaolyuh”的评论

引用来自“沧海_Sea”的评论

update number set x=x-1 where x > 0
mysql 的事务隔离级别是 repeatable read 这个 sql 更新库存肯定会出问题

@沧海_Sea 更新的时候会加排他锁啊,加了排他锁更新就是串行执行的了。为什么会有问题呢!

引用来自“沧海_Sea”的评论

read commit 事务隔离级别没问题 但是 repeatable read 下, 会有幻读的情况

引用来自“xiaolyuh”的评论

是不是这样子的,假如库存是5,有A、B两个请求分别创建了事务并且都没有提交,当A事务提交了,改了库存是5,但是因为是事务隔离级别是可重复读的,所有B看不到A事务改的库存。到时B看到的库存还是5,所以出现了超扣的问题?

引用来自“沧海_Sea”的评论

是的 可以修改隔离级别为 read commit 或者在事务开启之前使用redis加锁

引用来自“xiaolyuh”的评论

这个我写代码测试了 但是怎么没有出现超扣问题?

引用来自“沧海_Sea”的评论

可能是测试方式有问题吧

引用来自“xiaolyuh”的评论

我开启了两个mysql客户端,将他们的自动提交关掉了。在A客户端执行更新,提交后怎么马上就能在B客户端查询到啊,按道理B客户端是可重复读的不因该能看到更改啊

引用来自“沧海_Sea”的评论

1 自动提交关掉
2 A 客户端查询
3 B 客户端查询
4 A 客户端更新
5 B客户端查询
在第5步确实查不到第4步的更新,但是如果这样:
6 A客户端提交
7 B客户端查询 这个时候还是查不到第4步跟新的数据
8 B客端更新
9 B客户端查询 这个时候看到的库存是扣了两个的。没有超扣

所以我认为可重复读是针对读的,因为mysql是基于多版本并发控制的,在更新的时候他会去先去插入一条数据并将这条数据的创建版本号设置成当前事务版本号,将当前事务版本号设置成老数据的删除版本号。所以不会有超扣的问题

@xiaolyuh 刚才试了下,确实是这样子的��丢人了
2018/01/31 17:29

引用来自“freezingsky”的评论

用户下单三个商品,前面二个扣成功能,第三个扣不成功,你这种方式怎么办?
1:直接返回下单失败
2:直接买两个商品
感觉第一种合理一些,这样可以提示用户,并让用户决定是否继续购买剩余两个商品
2018/01/31 16:45

引用来自“xiaolyuh”的评论

引用来自“沧海_Sea”的评论

update number set x=x-1 where x > 0
mysql 的事务隔离级别是 repeatable read 这个 sql 更新库存肯定会出问题

@沧海_Sea 更新的时候会加排他锁啊,加了排他锁更新就是串行执行的了。为什么会有问题呢!

引用来自“沧海_Sea”的评论

read commit 事务隔离级别没问题 但是 repeatable read 下, 会有幻读的情况

引用来自“xiaolyuh”的评论

是不是这样子的,假如库存是5,有A、B两个请求分别创建了事务并且都没有提交,当A事务提交了,改了库存是5,但是因为是事务隔离级别是可重复读的,所有B看不到A事务改的库存。到时B看到的库存还是5,所以出现了超扣的问题?

引用来自“沧海_Sea”的评论

是的 可以修改隔离级别为 read commit 或者在事务开启之前使用redis加锁

引用来自“xiaolyuh”的评论

这个我写代码测试了 但是怎么没有出现超扣问题?

引用来自“沧海_Sea”的评论

可能是测试方式有问题吧

引用来自“xiaolyuh”的评论

我开启了两个mysql客户端,将他们的自动提交关掉了。在A客户端执行更新,提交后怎么马上就能在B客户端查询到啊,按道理B客户端是可重复读的不因该能看到更改啊

引用来自“沧海_Sea”的评论

1 自动提交关掉
2 A 客户端查询
3 B 客户端查询
4 A 客户端更新
5 B客户端查询
在第5步确实查不到第4步的更新,但是如果这样:
6 A客户端提交
7 B客户端查询 这个时候还是查不到第4步跟新的数据
8 B客端更新
9 B客户端查询 这个时候看到的库存是扣了两个的。没有超扣

所以我认为可重复读是针对读的,因为mysql是基于多版本并发控制的,在更新的时候他会去先去插入一条数据并将这条数据的创建版本号设置成当前事务版本号,将当前事务版本号设置成老数据的删除版本号。所以不会有超扣的问题
2018/01/31 13:56

引用来自“xiaolyuh”的评论

引用来自“沧海_Sea”的评论

update number set x=x-1 where x > 0
mysql 的事务隔离级别是 repeatable read 这个 sql 更新库存肯定会出问题

@沧海_Sea 更新的时候会加排他锁啊,加了排他锁更新就是串行执行的了。为什么会有问题呢!

引用来自“沧海_Sea”的评论

read commit 事务隔离级别没问题 但是 repeatable read 下, 会有幻读的情况

引用来自“xiaolyuh”的评论

是不是这样子的,假如库存是5,有A、B两个请求分别创建了事务并且都没有提交,当A事务提交了,改了库存是5,但是因为是事务隔离级别是可重复读的,所有B看不到A事务改的库存。到时B看到的库存还是5,所以出现了超扣的问题?

引用来自“沧海_Sea”的评论

是的 可以修改隔离级别为 read commit 或者在事务开启之前使用redis加锁

引用来自“xiaolyuh”的评论

这个我写代码测试了 但是怎么没有出现超扣问题?

引用来自“沧海_Sea”的评论

可能是测试方式有问题吧

引用来自“xiaolyuh”的评论

我开启了两个mysql客户端,将他们的自动提交关掉了。在A客户端执行更新,提交后怎么马上就能在B客户端查询到啊,按道理B客户端是可重复读的不因该能看到更改啊
1 自动提交关掉
2 A 客户端查询
3 B 客户端查询
4 A 客户端更新
5 B客户端查询
2018/01/31 13:48

引用来自“xiaolyuh”的评论

引用来自“沧海_Sea”的评论

update number set x=x-1 where x > 0
mysql 的事务隔离级别是 repeatable read 这个 sql 更新库存肯定会出问题

@沧海_Sea 更新的时候会加排他锁啊,加了排他锁更新就是串行执行的了。为什么会有问题呢!

引用来自“沧海_Sea”的评论

read commit 事务隔离级别没问题 但是 repeatable read 下, 会有幻读的情况

引用来自“xiaolyuh”的评论

是不是这样子的,假如库存是5,有A、B两个请求分别创建了事务并且都没有提交,当A事务提交了,改了库存是5,但是因为是事务隔离级别是可重复读的,所有B看不到A事务改的库存。到时B看到的库存还是5,所以出现了超扣的问题?

引用来自“沧海_Sea”的评论

是的 可以修改隔离级别为 read commit 或者在事务开启之前使用redis加锁

引用来自“xiaolyuh”的评论

这个我写代码测试了 但是怎么没有出现超扣问题?

引用来自“沧海_Sea”的评论

可能是测试方式有问题吧
我开启了两个mysql客户端,将他们的自动提交关掉了。在A客户端执行更新,提交后怎么马上就能在B客户端查询到啊,按道理B客户端是可重复读的不因该能看到更改啊
2018/01/31 13:41

引用来自“xiaolyuh”的评论

引用来自“沧海_Sea”的评论

update number set x=x-1 where x > 0
mysql 的事务隔离级别是 repeatable read 这个 sql 更新库存肯定会出问题

@沧海_Sea 更新的时候会加排他锁啊,加了排他锁更新就是串行执行的了。为什么会有问题呢!

引用来自“沧海_Sea”的评论

read commit 事务隔离级别没问题 但是 repeatable read 下, 会有幻读的情况

引用来自“xiaolyuh”的评论

是不是这样子的,假如库存是5,有A、B两个请求分别创建了事务并且都没有提交,当A事务提交了,改了库存是5,但是因为是事务隔离级别是可重复读的,所有B看不到A事务改的库存。到时B看到的库存还是5,所以出现了超扣的问题?

引用来自“沧海_Sea”的评论

是的 可以修改隔离级别为 read commit 或者在事务开启之前使用redis加锁

引用来自“xiaolyuh”的评论

这个我写代码测试了 但是怎么没有出现超扣问题?
可能是测试方式有问题吧
2018/01/31 13:34
用户下单三个商品,前面二个扣成功能,第三个扣不成功,你这种方式怎么办?
2018/01/31 13:19

引用来自“xiaolyuh”的评论

引用来自“沧海_Sea”的评论

update number set x=x-1 where x > 0
mysql 的事务隔离级别是 repeatable read 这个 sql 更新库存肯定会出问题

@沧海_Sea 更新的时候会加排他锁啊,加了排他锁更新就是串行执行的了。为什么会有问题呢!

引用来自“沧海_Sea”的评论

read commit 事务隔离级别没问题 但是 repeatable read 下, 会有幻读的情况

引用来自“xiaolyuh”的评论

是不是这样子的,假如库存是5,有A、B两个请求分别创建了事务并且都没有提交,当A事务提交了,改了库存是5,但是因为是事务隔离级别是可重复读的,所有B看不到A事务改的库存。到时B看到的库存还是5,所以出现了超扣的问题?

引用来自“沧海_Sea”的评论

是的 可以修改隔离级别为 read commit 或者在事务开启之前使用redis加锁
这个我写代码测试了 但是怎么没有出现超扣问题?
2018/01/31 12:32

引用来自“xiaolyuh”的评论

引用来自“沧海_Sea”的评论

update number set x=x-1 where x > 0
mysql 的事务隔离级别是 repeatable read 这个 sql 更新库存肯定会出问题

@沧海_Sea 更新的时候会加排他锁啊,加了排他锁更新就是串行执行的了。为什么会有问题呢!

引用来自“沧海_Sea”的评论

read commit 事务隔离级别没问题 但是 repeatable read 下, 会有幻读的情况

引用来自“xiaolyuh”的评论

是不是这样子的,假如库存是5,有A、B两个请求分别创建了事务并且都没有提交,当A事务提交了,改了库存是5,但是因为是事务隔离级别是可重复读的,所有B看不到A事务改的库存。到时B看到的库存还是5,所以出现了超扣的问题?
是的 可以修改隔离级别为 read commit 或者在事务开启之前使用redis加锁
2018/01/31 11:28

引用来自“xiaolyuh”的评论

引用来自“沧海_Sea”的评论

update number set x=x-1 where x > 0
mysql 的事务隔离级别是 repeatable read 这个 sql 更新库存肯定会出问题

@沧海_Sea 更新的时候会加排他锁啊,加了排他锁更新就是串行执行的了。为什么会有问题呢!

引用来自“沧海_Sea”的评论

read commit 事务隔离级别没问题 但是 repeatable read 下, 会有幻读的情况
是不是这样子的,假如库存是5,有A、B两个请求分别创建了事务并且都没有提交,当A事务提交了,改了库存是5,但是因为是事务隔离级别是可重复读的,所有B看不到A事务改的库存。到时B看到的库存还是5,所以出现了超扣的问题?
2018/01/31 11:12

引用来自“xiaolyuh”的评论

引用来自“沧海_Sea”的评论

update number set x=x-1 where x > 0
mysql 的事务隔离级别是 repeatable read 这个 sql 更新库存肯定会出问题

@沧海_Sea 更新的时候会加排他锁啊,加了排他锁更新就是串行执行的了。为什么会有问题呢!

引用来自“沧海_Sea”的评论

read commit 事务隔离级别没问题 但是 repeatable read 下, 会有幻读的情况
repeatable read 是会有幻行问题,就是别的事物插入条新的数据然后提交过后再另一事务里面会出现。但是我们这里是更新,repeatable read是可重复读的,所以不会有问题啊
2018/01/31 10:26

引用来自“xiaolyuh”的评论

引用来自“沧海_Sea”的评论

update number set x=x-1 where x > 0
mysql 的事务隔离级别是 repeatable read 这个 sql 更新库存肯定会出问题

@沧海_Sea 更新的时候会加排他锁啊,加了排他锁更新就是串行执行的了。为什么会有问题呢!
read commit 事务隔离级别没问题 但是 repeatable read 下, 会有幻读的情况
2018/01/31 10:10

引用来自“沧海_Sea”的评论

update number set x=x-1 where x > 0
mysql 的事务隔离级别是 repeatable read 这个 sql 更新库存肯定会出问题

@沧海_Sea 更新的时候会加排他锁啊,加了排他锁更新就是串行执行的了。为什么会有问题呢!
2018/01/30 23:40
update number set x=x-1 where x > 0
mysql 的事务隔离级别是 repeatable read 这个 sql 更新库存肯定会出问题
回复 @
{{emojiItem.symbol}}
返回顶部
顶部