2016-01-17 27 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

相關問題