C# 如何在C中使用select语句锁定Oracle表?我尝试使用NOLOCK,但仍然无法锁定。我在使用任务时遇到冲突

C# 如何在C中使用select语句锁定Oracle表?我尝试使用NOLOCK,但仍然无法锁定。我在使用任务时遇到冲突,c#,oracle,winforms,C#,Oracle,Winforms,首先,我检查表,然后更新行。在这个过程中,我遇到了冲突。就像我有Windows窗体一样,如果我打开两个窗口,同一个应用程序将同时运行。我怀疑如果我使用Lock可以避免这种类型的冲突。Web非常简单,但Windows窗体我不知道。我正在使用Oracle public Tasks GetTaskDetails() { Tasks tasks = new Tasks(); DataLayer datalayer = new DataLayer(_strConn);

首先,我检查表,然后更新行。在这个过程中,我遇到了冲突。就像我有Windows窗体一样,如果我打开两个窗口,同一个应用程序将同时运行。我怀疑如果我使用Lock可以避免这种类型的冲突。Web非常简单,但Windows窗体我不知道。我正在使用Oracle

public Tasks GetTaskDetails()
{
        Tasks tasks = new Tasks();

        DataLayer datalayer = new DataLayer(_strConn);
        OracleCommand ocdSelect = new OracleCommand();

        Sqlquery = "SELECT * FROM basictasks NOLOCK WHERE STATUS = 1 and rownum = 1 order by TASKID";

        ocdSelect.CommandText = Sqlquery;

        DataTable dt = datalayer.GetResultDT(ocdSelect, false);

        if (dt.Rows.Count > 0)
        {
           tasks.TaskID = Convert.ToInt32(dt.Rows[0]["TASKID"]);
           tasks.MechineName = dt.Rows[0]["MACHINENAME"].ToString();
           tasks.Parameters = dt.Rows[0]["PARAMETERS"].ToString();
           tasks.TaskName = dt.Rows[0]["TASKNAME"].ToString();
           tasks.Description = dt.Rows[0]["DESCRIPTION"].ToString();
           tasks.Status = 2;
           tasks.StartTime = DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss tt");
           tasks.FinishJob = false;

           UpdateTaskDetails(tasks);

           return tasks;
       }           

       return null; 
}

public void UpdateTaskDetails(Tasks task)
{
        DataLayer datalayer = new DataLayer(_strConn);

        OracleCommand cmd = new OracleCommand(); 

        try
        {
            Sqlquery = "BEGIN ";

            if (task.FinishJob)
                Sqlquery += string.Format("UPDATE basictasks SET STATUS = " + task.Status + ", ENDTIME = SYSDATE,REMARK = '" + task.Remarks + "' WHERE TASKID = " + task.TaskID + " ;");
            else
                Sqlquery += string.Format("UPDATE basictasks SET STATUS = " + task.Status + ", STARTTIME = SYSDATE WHERE TASKID = " + task.TaskID + " ;");

            Sqlquery += " END;";

            datalayer.TableOperation_BySQL(Sqlquery, true);

            if (datalayer != null)

                datalayer.CheckTransaction(true); 
        }
        catch(Exception ex)
        {
        }
}

选择从…起是否要更新nowait?@DmitryBychenko是的,它似乎在工作。可以锁定,但如何提交。意思是更新后我需要提交。现在无法更新,因为表是锁。1。启动事务OracleTransaction 2。执行选择。。。从…起对于此事务中的update nowait,表现在已锁定3。在事务4中执行更新。提交事务并更新committed和lockreleased@DmitryBychenko好的,我现在就试试。@DmitryBychenko它正在工作,谢谢。无论如何,我得到了一个异常ORA-00054:资源繁忙,并在指定NOWAIT或超时的情况下获取。但我可以忽略它。谢谢