事务(进程ID)陷入僵局错误

时间:2018-06-30 18:29:17

标签: c# sql sql-server

我的代码及其死锁引起的大量SQL调用出现问题。我将代码粘贴到PasteBin中:https://pastebin.com/p1YDkKsB。有人可以帮我吗?它最常在以下CheckClanActivity任务中发生:

using(SqlCommand cmd = new SqlCommand(string.Format("select * from ClanMembers where MembershipId={0} and IsActive = 1", entry.Player.DestinyUserInfo.MembershipId), conn))

,但它也发生在整个地方。

编辑: 好的,所涉及的SQL语句如下:

if not exists(select * from ClanMembers where MembershipId={0}) begin insert into ClanMembers(ID, MembershipId, BattleNetId, ClanId, DateLastPlayed, IsActive, LastUpdated) select ISNULL(MAX(ID) + 1, 0),{0},'{1}',{2},'{3}', 1, GETDATE() from ClanMembers end else begin update ClanMembers set DateLastPlayed='{3}', LastUpdated=GETDATE() where MembershipId={0} end

if not exists(select * from ClanMemberCharacters where CharacterId={1}) begin insert into ClanMemberCharacters(ID,MembershipId,CharacterId) select ISNULL(MAX(ID)+1,0),{0},{1} from ClanMemberCharacters end

select c.* from ClanMemberCharacters c join ClanMembers m on m.MembershipId = c.MembershipId where m.IsActive = 1 ORDER BY m.MembershipId desc

select * from ActivityHistory where InstanceId = {0}

if not exists(select * from ActivityHistory where InstanceId = {0}) begin insert into ActivityHistory(InstanceId,MembershipId,CharacterId,GameMode,ActivityDate,ReferenceId,DirectorActivityHash,IsPrivate,ClanActivity,ClanActivityCount) values( {0},{1},{2},'{3}','{4}',{5},{6},{7},{8},{9} ) END

select * from ClanMembers where IsActive = 1

Select * from ClanMembers where IsActive = 0

update ClanMembers set IsActive = 1 where MembershipId = {0}

select * from ClanMembers where MembershipId={0} and IsActive = 1

1 个答案:

答案 0 :(得分:0)

我怀疑问题是SqlConnection嵌套在一起,而其中的连接字符串相同。建议:

  1. 将连接using移动到尽可能靠近命令范围的位置。例如,避免从内部调用其他方法。
  2. 避免使用if (conn.State == ConnectionState.Closed) { conn.Open(); },只需将conn.Open();移到SqlConnection使用的第一位即可。
  3. 删除conn.Close(),这将在离开using块时自动完成。
  4. SqlDataAdapter也是一次性的,因此应该放在using块中。
  5. 您捕获和吞下异常的方式意味着呼叫者不知道有什么地方出错了。考虑使用throw;抛出异常,或者在此处不捕获异常,并在调用堆栈上捕获该异常。
  6. 记录错误的方式不会帮助您诊断问题。考虑记录ex.ToString(),而不只是ex.Message
  7. 分开您的担忧。您将所有东西都塞在一起。重构代码,使数据层与业务逻辑分离。
  8. 请避免执行string.Format来构造查询,因为这样做会使它们容易受到SQL注入攻击的攻击。<​​/ li>