2016-01-17 31 views
1

我有一个表,例如stock如何使用shell模拟并发SQL命令

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

这是一个好办法:

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末,使之不会退出,而作业仍在运行。

0

您可以使用存储过程或函数。如果这个过程是这样的顺序的话,那么就是 。

或更高级的步骤使用组合mysql存储过程+ php + apache基准。 apache基准测试能够一次产生多个进程来模拟服务器负载。 有多个存储过程立即运行,以模拟不仅库存减少而且库存增加。也可以将这些减少或加法与随机数结合起来。

这样一来,你将有更可靠的模拟,而不仅仅是一个简单的循环至极是单线程的情况

+0

,但它不是一个单独的线程我有一个'&'最后。 – zhuguowei

+0

但我认为你是对的,因为sql执行速度非常快,所以实际上它是序列化的 – zhuguowei

相关问题