mysql如何去掉已经缓存但还未执行的update语句
情况是这样的,服务器的mysql数据库由于数据越来越多经常出现慢查询(最长的查询时间有45秒,有select语句也有update语句),由于这种慢查询的操作,经常导致数据出现异常。比如以下这种情况:
程序有两个线程,分别为上线处理线程和下线处理线程(两个线程分别使用两个mysql连接)
A用户上线,上线处理线程会在user表中将A的status状态设置为1(表示上线);
A用户下线,下线处理线程会将user表中A的 status状态值设置为2(表示下线)。
假如A用户掉线时,此时将 UPDATE user SET status =2 where userid = A 这条语句添加进mysql,但此时由于各种原因吧,这条mysql语句还未真正执行,而此时用户A发现掉线,立即重新登录,此时上线处理线程会将A的status设置为1,假设这条UPDATE user SET status =1 where userid = A语句立刻执行了,然后mysql才执行UPDATE user SET status =2 where userid = A 。这样就造成了用户A实际在线,而数据库记录状态为离线。
遇到这样的问题,我该如何解决?
目前的暂时解决方案是使用心跳包,每次收到A用户的报文就将status置为1,这样虽然可以避免,但增加了写库的负担。
还有一种我设想的方案,就是用户上线时先查数据库缓存的update语句,如果有UPDATE user SET status =2 where user id= A这条,就将其删掉不再执行,不知mysql能不能这样操作。
本人不是DBA,对数据库操作不是太懂。请各位给点意见 。欢迎大家共同讨论