用的默认的 Read Committed 并发控制,会不会出现多余的订单?
比如说现在有 100 个订单,会不会出现 100+个订单?
1
ipconfiger 2016-06-01 14:10:33 +08:00
要用 Serializable 才行
|
2
TangMonk OP @ipconfiger 读取数量和递减数量的时候都用 Serializable 吗?
|
3
tabris17 2016-06-01 14:22:55 +08:00
update product set inventory=inventory-1 where product_id=123 and inventory>=1
|
5
tabris17 2016-06-01 14:38:03 +08:00
@TangMonk 你是说先 select 出 inventory ,然后 update 语句里不判断 inventory ?那必须 Serializable 隔离级别或者加锁
|
7
TangMonk OP @tabris17 今天出现了这个问题,系统预先设置了 1000 个库存,然后后台发现 1008 个订单。。但是商品的数量还是为 0 ,并没有为-8 。。
|
8
tabris17 2016-06-01 14:54:49 +08:00
@TangMonk 如果是 set inventory=inventory-1 不会出现这种情况,除非你是 set inventory=?
|
9
jjx 2016-06-01 15:01:52 +08:00
版本机制
或用队列 最安全的就是队列+版本机制 |
10
imzshh 2016-06-01 15:05:18 +08:00
关键词: select for update
|
13
TangMonk OP @imzshh FOR UPDATE 不会锁住 SELECT 吗?只会锁 UPDATE , DELETE 和 FOR UPDATE 吗?
|
14
TangMonk OP FOR UPDATE 貌似要比 Serializable 好用点
|
19
TangMonk OP @tabris17 刚才我开了几个线程请求测试了下,貌似不行,库存为 1000 ,库存递减到 0 的时候,才生成了 500 多个订单。。。
我换成 FOR UPDATE , 测试了下没有问题了。 看来要得好好补习下 MVCC 了 |
21
wdrsam 2016-06-03 15:36:35 +08:00
握草,楼主你们是某软 11 级,前身 andware ,大神是薛大神的那个团队?
|