对于edu近期bug的debug思路(等待放假归来验证)

edu最近两周发生很奇怪的问题,如下图所示,这个bug的简单描述就是同样的语句,通过mysql.data,取数据库,取到的值不稳定,有的时候能返回正确的值,有的时候就返回null,一开始认为是我们内部orm框架的bug,但是后来用直接调用mysqlcommand的ExecuteScalar方法也依然报错。而且这个bug只要一重启之后就恢复正常,一段时间,可能1天可能2天就又会重现,完全不知道该如何下手。因为这个问题,edu产生了很多插曲,这个有空详细总结下edu在这次异动中的经验教训,项目两年了,还是不断重复着昨天的故事。

 

 

回到这个bug,我今天回头从mysql.data的源码里面找原因,看到几个可疑的地方

mysqlcommand的ExecuteScalar方法内部调用的还是mysqlreader这个对象,可以先排除语句本身的错误,因为确实没错,而且确实应该返回而且大部分时间返回正确的值,那么剩下的代码里面可以看到
public override object ExecuteScalar()
  {
            lastInsertedId = -1;
            object val = null;

            MySqlDataReader reader = ExecuteReader();
            if (reader == null) return null;

            try
            {
                if (reader.Read())
                    val = reader.GetValue(0);
            }
            finally
            {
                if (reader != null)
                {
                    reader.Close();
                    lastInsertedId = reader.InsertedId;
                }
                reader = null;
            }

            return val;
  }

reader等于null,或者reader返回的结果为null会导致这个问题,那

1、reader为null,构建reader失败可能就是原因

 在看reader返回结果是null又会存在什么可能?

ExecuteReader()里面的代码

catch (MySqlException ex)
            {
                // if we caught an exception because of a cancel, then just return null
                if (ex.Number == 1317)
                {
                    if (TimedOut)
                        throw new MySqlException(Resources.Timeout);
                    return null;
                }
                if (ex.IsFatal)
                    Connection.Close();
                if (ex.Number == 0)
                    throw new MySqlException(Resources.FatalErrorDuringExecute, ex);
                throw;
            }

这段catch里面有个值得注意的地方,

2、错误代码1317,

Error: 1317 SQLSTATE: 70100 (ER_QUERY_INTERRUPTED)

Message: Query execution was interrupted

官方的解释是代码执行被中断,这个也是个可能的地方

总结,这次放假归来,我一定要查出这个bug的原因,而且我也发现大家对mysql.data不了解,这次debug输出出来的东西为什么要用cmd.ExecuteScalar这个方法,而不是直接用mysqlreader,这样才能看出问题的原因,工作在.net上,已经很多东西都看不到了,如果看过源码,一定知道要打印的是mysqlreader里面的东西,我们都还是低水平的debug。没见到高明的人是怎么做的。不要自我满足,你我都是井底之蛙。我们这没有牛人。

原文地址:https://www.cnblogs.com/brightwang/p/2004453.html