合理使用数据库事务和锁
问题:新增脚本定时查询库中特定状态值的数据,将其更新为其他状态,使状态能够继续流转。可是库中该种状态的数据可能有几十万条,如果一次查询出来处理,db可能会查询失败或连接超时。于是需要分批处理,比如,一次处理1000条数据。循环1000条数据,判断状态,符合条件,进行更新。为了防止别的程序同时更新同样的程序,故在查询1000条数据前开启事务,1000数据处理结束后关闭事务。在流量较大或需要更新数据较多的情况下,这样加锁会影响用户体验,甚至导致响应超时,报499错误。
解决办法:事务肯定要去掉,然后评估并发更新数据的影响,在更新语句中加上对状态字段的判断,即只更新特定状态的数据,其他状态的数据不进行更新。