今天遇到個奇怪的問題, 一個秒殺商品系統, 大量秒殺請求進來, 到了action竟然是單線程執行! 這樣產生的效果就是「這個系統好慢啊!!」。數據庫
但是我沒有加lock,爲何會變成單線程執行呢?session
找資料才知道, session有個鎖機制。性能
資料內容:測試
和數據庫的鎖同樣, 分共享鎖和排它鎖。spa
共享鎖佔用時,排它鎖必須等待,而另外一個共享鎖能夠同事訪問;線程
排它鎖佔用時,其餘全部鎖都必須等待。事務
兩個鎖的持續時間都是整個action走完才釋放。相似於Repeatable以上的事務隔離級別。io
而個人實際測試結果是:table
不管是讀仍是寫,都是排它鎖佔用!請求
也就是說,只要用到session,哪怕在BaseController裏僅僅讀取, 最終action也是線性執行的。
所以session是性能殺手。