今天遇到个奇怪的问题, 一个秒杀商品系统, 大量秒杀请求进来, 到了action竟然是单线程执行! 这样产生的效果就是“这个系统好慢啊!!”。数据库
但是我没有加lock,为何会变成单线程执行呢?session
找资料才知道, session有个锁机制。性能
资料内容:测试
和数据库的锁同样, 分共享锁和排它锁。spa
共享锁占用时,排它锁必须等待,而另外一个共享锁能够同事访问;线程
排它锁占用时,其余全部锁都必须等待。事务
两个锁的持续时间都是整个action走完才释放。相似于Repeatable以上的事务隔离级别。io
而个人实际测试结果是:table
不管是读仍是写,都是排它锁占用!请求
也就是说,只要用到session,哪怕在BaseController里仅仅读取, 最终action也是线性执行的。
所以session是性能杀手。