日期:2014-05-17  浏览次数:20805 次

进程死锁问题
调试发现经常会进入如下代码的异常中,说是经常被锁,被牺牲掉了
public static DataTable getDataByProc(string procName, string connString, params SqlParameter[] ps)
  {
  using (SqlConnection conn = new SqlConnection(connectionString(connString)))
  {
  using (SqlCommand comm = new SqlCommand(procName, conn))
  {
  DataTable dt = new DataTable();
  try
  {
  conn.Open();
  SqlDataAdapter sda = new SqlDataAdapter();
  sda.SelectCommand = comm;
  comm.CommandType = CommandType.StoredProcedure;
  foreach (SqlParameter p in ps)
  {
  comm.Parameters.Add(p);
  }
  sda.Fill(dt);
  }
  catch (Exception) { throw; }
  finally
  {
  comm.Parameters.Clear();
  comm.Dispose();
  conn.Close();
  }
  return dt;
  }
  }
  }

------解决方案--------------------
检查一下存储过程中有没有其他和同一个表相关的事务没有提交或回滚。
在存储过程中特别是删改的操作,会产生各种锁,可以降低锁的级别或选用适当的隔离级别等。
------解决方案--------------------
如果合同一张表相关的所有事务都是用来查询(虽然我觉得不太可能),可以试一下未提交读的隔离级别,可以在select语句后加入with (nolock)例如select userid,username,userage from users with (nolock)

这样。请求数据就可以不请求S锁,但是会产生脏读。