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