猿问

感觉是get方法和事务用了两个连接,发生了死锁?

经过调试,发现其它情况(如数据库连接)正常,只是在执行一条多表连接查询时一定超时(数据库数据只有十多条)。
由于采用分层开发,但将所有操作放在一起后,却不见超时问题。
程序简单分为3层,数据层select直接调用连接,insert和update使用逻辑层的事务参数。
以下为部分代码:
using (SqlConnection con = Helper.GetSqlConnection())
{
con.Open();
using (SqlTransaction trans = con.BeginTransaction())
{
try
{
//删除原来的权限、用户组关系
HAuthGroup.DeleteAuth_groupByAuthID(auth.Auth_id, con, trans);
//更新权限
HAuthority.UpdateAuthority(auth, con, trans);
//如果新类别关联了用户组,添加新的权限、用户组关系
AuthType type = HAuthType.GetAuthTypeByID(auth.Type_id);
///测试,添加几个读数据库方法
HGroup.GetGroupsByAuthType(new AuthType());
///该处会导致超时
List<Group> groups = HGroup.GetGroupsByAuthType(type);
if (groups.Count > 0)
{
foreach (Group group in groups)
{
HAuthGroup.AddAuth_group(group.Group_id, auth.Auth_id, con, trans);
}
}
trans.Commit();
}
catch
{
trans.Rollback();
}
}
}

public static List<Group> GetGroupsByAuthType(AuthType type)
{
string strCmd = "select * from [sb_group] where [group_id] in(select [group_id] from [sb_auth_group] where [auth_id] in(select [auth_id] from [sb_authority] where [type_id]=" + type.Type_id + "))";
return GetGroups(strCmd);
}

private static List<Group> GetGroups(string strCmd)
{
List<Group> groups = new List<Group>();
using (SqlConnection con = Helper.GetSqlConnection())
{
try
{
con.Open();
SqlCommand cmd = new SqlCommand(strCmd, con);
cmd.CommandTimeout = 5;
using (SqlDataReader reader = cmd.ExecuteReader())

// cmd.ExecuteReader()超时 !
1 将所有方法全部集成到一个方法里,多层嵌套的子查询可以执行,且不会超时。
2 在逻辑层单独调用GetGroupsByAuthType(AuthType type) 方法,没有异常。
3 注释掉 HAuthority.UpdateAuthority(auth, con, trans),没有异常。

慕斯709654
浏览 104回答 2
2回答

慕侠2389804

SELECT *FROM [sb_group]WHERE [group_id] IN (SELECT [group_id]FROM [sb_auth_group]WHERE [auth_id] IN ( SELECT [auth_id]FROM [sb_authority]WHERE [type_id] = " + type.Type_id + " ) )此处的查询语句 3层in查询 效率 会有问题如果数据量大的话 超时会发生.

海绵宝宝撒

同意楼上的说法,查询语句复杂度太深,也许你在本地运行时没有问题,当在服务器上的SqlServer运行时间太长导致的,后者语句本有问题。建议可以分批操作。
随时随地看视频慕课网APP
我要回答