如何使用shell模拟并发SQL命令

时间:2016-01-17 09:43:03

标签: mysql shell

我有一张桌子,例如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个用户同时提交订单一样?

2 个答案:

答案 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基准测试能够同时生成多个进程以模拟服务器负载。 有多个存储过程可以立即运行,不仅可以模拟库存减少,还可以模拟库存增加。并且还可以将这些减少或添加与随机数组合。

这样,您将获得更可靠的模拟,而不仅仅是一个单线程场景的简单循环