使用 Monitor 线程插入查询时 SQL 中出现死锁

本文关键字:死锁 SQL Monitor 线程 插入 查询 使用 | 更新日期: 2023-09-27 18:31:32

由于

某种原因,当我尝试运行 SP 将即时数据插入数据库时遇到死锁

使用此表的所有其他线程工作正常。当我通过SQL服务器管理工作室手动向此表添加新行时,它会释放锁并将所有值插入队列中

这是我的代码:

    Queue<IDbCommand> instatntDataCmdQ;
    public void ExecuteInstantDataCmd(int channel, DateTime date, double val, int status)
    {
        System.Data.SqlClient.SqlCommand cmd = GetInstantDataCmd( channel, date, val, status);
        lock (instatntDataCmdQ)
        {
            try
            {
                instatntDataCmdQ.Enqueue(cmd);
                Monitor.Pulse(instatntDataCmdQ);
            }
            catch
            {
            }
        }
    }

    void thInstantDataRun()
    {
        instatntDataCmdQ = new Queue<IDbCommand>(100);
        while (true)
        {
            try
            {
                IDbCommand cmd;
                lock (instatntDataCmdQ)
                {
                    if (instatntDataCmdQ.Count == 0)
                        Monitor.Wait(instatntDataCmdQ);
                    if (instatntDataCmdQ.Count == 0 || (cmd = instatntDataCmdQ.Dequeue()) == null)
                        break;
                }
                try
                {
                    //open connection.
                    if (cmd.Connection.State == ConnectionState.Closed)
                        cmd.Connection.Open();
                    if (cmd.Connection.State != ConnectionState.Open)
                    {
                        cmd.Connection.Close();
                        cmd.Connection.Open();
                    }

                    cmd.ExecuteNonQuery();
                }
                catch (System.Data.SqlClient.SqlException dex)
                {
                        AddDBlog(cmd.Connection, "thInstantDataRun",
                            "Critical error, duplicate dateTime&channel in InstantData table'r'n" + dex.Message);
                }
                catch (Exception err)
                {
                        AddDBlog(cmd.Connection, "thInstantDataRun", "Error Executing Command " + err.Message);
                }
                finally
                {
                    //do not close connection
                    //this some time will take up to 1 second and will make the insert of the isntant slow
                    // cmd.Connection.Close();
                    cmd.Dispose();
                    cmd = null; 
                }
            }
            catch
            {
            }
        }
    }

使用 Monitor 线程插入查询时 SQL 中出现死锁

问题是我没有关闭 C# 和 SQL 之间的通信。该州被标记为开放并被卡住了。只有在重新打开通信后,问题才得到解决。