Таблица Oracle блокируется при попытке записать сгусток - PullRequest
0 голосов
/ 06 февраля 2019

Я записываю форматированный текст в CLOB в таблице Oracle.В конце концов, при запуске процесса таблица будет заблокирована.Когда наш администратор БД проверяет соединения, создается впечатление, что я создал несколько блокировок для таблицы и других соединений от других пользователей нет.Любые идеи о том, почему приведенный ниже код может в конечном итоге создать блокировки на столе?Обычно этот код запускается несколько дней по 100 раз в день, прежде чем будет создана блокировка.Похоже, что нет зависших транзакций.

public void Update_Html_Out(string key, string shortTitle, string htmlText)
{
    byte[] newvalue = Encoding.Unicode.GetBytes(htmlText);

    string sql = "UPDATE html_out SET short_title = :short_title, actual_text = :clob WHERE key = :key";

    using (var conn = new OracleConnection(_connectionString))
    using (var cmd = new OracleCommand(sql, conn))
    {
        conn.Open();

        using (var transaction = conn.BeginTransaction(IsolationLevel.ReadCommitted))
        {
            cmd.Transaction = transaction;
            using (var clob = new OracleClob(conn))
            {
                clob.Write(newvalue, 0, newvalue.Length);

                cmd.Parameters.Add("short_title", shortTitle);
                cmd.Parameters.Add("clob", clob);
                cmd.Parameters.Add("key", key);

                cmd.ExecuteNonQuery();

                transaction.Commit();
            }
        }
    }
}

1 Ответ

0 голосов
/ 06 февраля 2019

Попробуйте этот код.Обратите внимание, вам нужно сохранить CLOB, а не BLOB (вы это сказали)

public void Update_Html_Out(string key, string shortTitle, string htmlText)
{
    string sql = @"UPDATE html_out SET 
                     short_title = :short_title, 
                     actual_text = :clob 
                   WHERE key = :key";

    using (var conn = new OracleConnection(_connectionString))
    {
        conn.Open();

        using (var transaction = conn.BeginTransaction(IsolationLevel.ReadCommitted))
        {
            using (var cmd = new OracleCommand(sql, conn))
            {
                cmd.Transaction = transaction;
                cmd.Parameters.Add("short_title", OracleDbType.Varchar2, shortTitle, ParameterDirection.Input);
                cmd.Parameters.Add("clob", OracleDbType.Clob, htmlText, ParameterDirection.Input);
                cmd.Parameters.Add("key", OracleDbType.Varchar2, key, ParameterDirection.Input);

                cmd.ExecuteNonQuery();
            }
            transaction.Commit();
        }
    }
}
...