Как заблокировать таблицу Oracle с помощью оператора select в C#? Я пытался использовать NOLOCK, но все еще не могу заблокировать. Я получаю конфликты при использовании задач - PullRequest
0 голосов
/ 14 февраля 2020

Сначала я проверяю таблицу, затем обновляю строку. В рамках этого процесса я получаю конфликт. Как у меня есть Windows формы, если я открою 2 windows одно и то же приложение, оба работают в одно и то же время. Я подозреваю, что, если я использую Lock, сможет избежать этого типа конфликта. Веб очень простой, но 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)
        {
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...