我有一张桌子,例如stock
:
SELECT * FROM stock;
+------------+----------+
| product_id | quantity |
+------------+----------+
| 1 | 100 |
+------------+----------+
我想模拟并发提交订单,同时减少库存:
UPDATE store SET quantity = quantity-${count} WHERE product_id = ${product_id}
我想知道这个SQL是否是线程安全的。我只是使用以下方式来模拟并发操作:
for ((i=0; i<100; i++))
do
mysql -uroot -p123456 test -e "update stock set quantity=quantity-1 where product_id = 1" >/dev/null &
done
然后检查最终数量是否为0。 我想知道这种方式是否正确?也就是说,它是否正确发送并发SQL命令,就像100个用户同时提交订单一样?
答案 0 :(得分:0)
这是一个很好的方法:
for ((i=0; i<100; i++)); do
mysql -uroot -p123456 test -e "update stock set quantity=quantity-1 where product_id = 1" >/dev/null &
done
wait
当作业仍在运行时,您需要最后的wait
才能退出。
答案 1 :(得分:0)
您可以使用存储过程或函数。 如果这个过程是顺序的那样。
或更高级的步骤使用组合mysql存储过程+ php + apache基准测试。 apache基准测试能够同时生成多个进程以模拟服务器负载。 有多个存储过程可以立即运行,不仅可以模拟库存减少,还可以模拟库存增加。并且还可以将这些减少或添加与随机数组合。
这样,您将获得更可靠的模拟,而不仅仅是一个单线程场景的简单循环