首页 新闻 搜索 专区 学院

担心了几年的事情终于发生了,查询A表却返回了B表的数据

0
悬赏园豆:20 [待解决问题]

问题描述:

系统上线后,间歇性的出现客户联系客服说登陆到了别人的账户里,一开始没在乎,后来记录日志发现事情不对了。
问题出现后,我们尝试过升级net core版本、关闭连接池、更换orm为纯ado.net、升级数据库版本,然而这个问题一直存在。我们也怀疑过与并发有关系,但是日志记录完全是随机的,并发量高的时候并没有明显增加次数,凌晨2-4点也时有日志记录。
不知道有没有同入坑并已经解决了问题的大神,指点一二!

出现过问题的环境:

  • windows server 2016/2019
  • IIS10
  • asp.net mvc 4 | asp.net core 2.2/3.1
  • sqlserver 2017/2019

参考代码:

var unionid="owuO0s4-yNxC----_q3MQbKG5TS0"; // 每个客户unionid不同
var memberEntity = new Member(); 
var memberEntityValidate = new Member();
string strSqlMember = $" select * from Member where UnionId='{unionid}' ";
// 同一条Sql第一次运行
using (SqlConnection connection=new SqlConnection(dataSource.DbConnectionString))
{
        DataTable dt = new DataTable();
        connection.Open();
        SqlDataAdapter sda = new SqlDataAdapter(strSqlMember, connection);
        sda.Fill(dt);
        connection.Close();
        sda.Dispose();
        if (dt != null && dt.Rows.Count > 0)
        {
               memberEntity = dt.ToSingleModel<Member>();
        }
}
// 同一条Sql第二次运行
using (SqlConnection connection = new SqlConnection(dataSource.DbConnectionString))
{
        DataTable dt = new DataTable();
        connection.Open();
        SqlDataAdapter sda = new SqlDataAdapter(strSqlMember, connection);
        sda.Fill(dt);
        connection.Close();
        sda.Dispose();
        if (dt != null && dt.Rows.Count > 0)
        {
               memberEntityValidate = dt.ToSingleModel<Member>();
        }
}
// 如果获取到的数据不一致
if (memberEntity.Id != memberEntityValidate.Id)
{
        // 记录日志
        log.Error($"member数据错乱,memberEntity:{memberEntity.ToJson()},memberEntityValidate:{memberEntityValidate.ToJson()}");
}

神奇的事情发生了,记录到的日志为:

2020-04-07 20:54:54.3398 ERROR member数据错乱:
memberEntity:
{
"UnionId": "oQZ9ns5NmKI----o3nio6a3L4l7s",
"OpenId": "",
"Id": 4237,
"Delstatus": false,
"AddTime": "2020-02-04 21:48:38",
"UpdateTime": "2020-02-28 20:13:33"
},
memberEntityValidate:
{
"UnionId": "owuO0s4-yNxC----_q3MQbKG5TS0",
"OpenId": "oCrVD0esYbNej----jNtz7l3rm9Q",
"Name": "",
"Phone": "",
"Id": 7409,
"Delstatus": false,
"AddTime": "2020-04-02 18:05:52",
"UpdateTime": "2020-04-06 22:29:10"
}

从日志可以看到memberEntityValidate查询的数据是对的,而memberEntity中的数据,我们找了很久发现不是Member表中的数据,只是那张表也存在UnionId字段,而"Id": 4237也刚好对上。
(注:这是最特殊的情况,更多的时候是两次查询返回的数据都是Member表中的数据,只是UnionId和Id对不上)

月下*独的主页 月下*独 | 初学一级 | 园豆:128
提问于:2020-04-27 14:47

建议改进一下排版,支持 markdown 语法

dudu 5个月前

@dudu: get!٩( 'ω' )و

月下*独 5个月前
< >
分享
所有回答(3)
0

几年前的“担心”是基于什么因素想到的?
最好能写一个能重现问题的demo,模拟一下试试

会长 | 园豆:8990 (大侠五级) | 2020-04-27 15:03

直觉,哈哈,感觉碰到和解决这个问题是我的使命(标题党)
最大的问题就是不能重现,完全是随机出现的,同样的参数再来一遍又是好的。这个方法每天要执行几万次,偶尔才会记到一次日志。

支持(0) 反对(0) 月下*独 | 园豆:128 (初学一级) | 2020-04-27 15:17
0

在数据库端跟踪下sql,看应用发过来的sql是什么样的。分析是数据库的问题,还是应用的问题。

保镖 | 园豆:620 (小虾三级) | 2020-04-27 15:37

监控已经开起来了,始终不相信sqlserver会出现这种问题。
一定是我哪里打开的方式不对 ̄へ ̄

支持(0) 反对(0) 月下*独 | 园豆:128 (初学一级) | 2020-04-27 16:40

@月下*独: 我用过10多年.net了,没遇到过这种情况。是不是你的代码在.net core下跑就有问题,试没试过.net下跑?线下也有问题吗?

支持(0) 反对(0) 保镖 | 园豆:620 (小虾三级) | 2020-04-27 16:44

@保镖: 十年.Net大哥,关注了

支持(0) 反对(0) 猝不及防 | 园豆:1977 (小虾三级) | 2020-04-27 16:56

@保镖: asp.net mvc 4 我们也有一个项目,一直没有人报过此类问题,不过前段时间加了一下日志,发现也会出现这个问题,好尴尬。。。我把asp.net mvc 4加到上文“出现过问题的环境:”中去。

支持(0) 反对(0) 月下*独 | 园豆:128 (初学一级) | 2020-04-27 17:26
0

我猜是 数据库连接池设置不对造成的数据混乱, 因为我也曾试过, 查询出来的数据完全对不上号的

风浪 | 园豆:2861 (老鸟四级) | 2020-04-28 11:07

我们只修改了连接字符串中的max pool size=500,别的没有什么特殊的处理,方便提示一下你当时碰到的问题和解决的方案吗?

支持(0) 反对(0) 月下*独 | 园豆:128 (初学一级) | 2020-04-28 14:07
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册