系统上线后,间歇性的出现客户联系客服说登陆到了别人的账户里,一开始没在乎,后来记录日志发现事情不对了。
问题出现后,我们尝试过升级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对不上)
几年前的“担心”是基于什么因素想到的?
最好能写一个能重现问题的demo,模拟一下试试
直觉,哈哈,感觉碰到和解决这个问题是我的使命(标题党)
最大的问题就是不能重现,完全是随机出现的,同样的参数再来一遍又是好的。这个方法每天要执行几万次,偶尔才会记到一次日志。
在数据库端跟踪下sql,看应用发过来的sql是什么样的。分析是数据库的问题,还是应用的问题。
监控已经开起来了,始终不相信sqlserver会出现这种问题。
一定是我哪里打开的方式不对 ̄へ ̄
@月下*独: 我用过10多年.net了,没遇到过这种情况。是不是你的代码在.net core下跑就有问题,试没试过.net下跑?线下也有问题吗?
@保镖: 十年.Net大哥,关注了
@保镖: asp.net mvc 4 我们也有一个项目,一直没有人报过此类问题,不过前段时间加了一下日志,发现也会出现这个问题,好尴尬。。。我把asp.net mvc 4加到上文“出现过问题的环境:”中去。
我猜是 数据库连接池设置不对造成的数据混乱, 因为我也曾试过, 查询出来的数据完全对不上号的
我们只修改了连接字符串中的max pool size=500,别的没有什么特殊的处理,方便提示一下你当时碰到的问题和解决的方案吗?
楼主最终解决了吗?
建议改进一下排版,支持 markdown 语法
– dudu 4年前@dudu: get!٩( 'ω' )و
– 月下*独 4年前