上个周六,有场竞赛,由于是系统推荐的,参与的人数较多,大概有1100人参与了正赛(正赛的意思是指在竞赛限定的时间范围参与并交卷;还有个补赛,在限定时间范围以外的)。结果出现了有用户无法提交正常的问题。查了下后台日志,发现在执行sql语句的时候,返回了数据库异常。
这是包含2条插入语句的语句。Too many active concurrent transactions,字面意思,太多活动的并发事务。有想到,这是不是Nhibernate在执行UniqueResult时,开启一个事务。但是查了下,并没有,如果需要还要用session显示开启。所以占用的还是mysql的事务数。
查了下表,answerlog是MyISAM引擎,而answerresult是Innodb引擎。想到MyISAM表,是不支持事务的,那么是不是anserresult占了太多事务?于是将anserresult的引擎统一改成了myisam。结果发现平时非高峰时段的请求响应时间耗时平均增加了200ms。
这样推测在高峰期会下降的更加厉害,所以不能这么改。把表引擎重新改了回去。既然是提示事务过多,那么查下mysql支持的事务数。
发现
在mysql 5.5.4之前,在一个回滚段上就支持最多1023个数据修改事务。可惜,生产跑的mysql是5.1的,要升级不大可能。
看来只能从业务上,做些调整。