Oracle table 在尝试写出 clob 时被锁定
Oracle table getting locked when trying to write out a clob
我正在将格式化文本写入 Oracle table 中的 CLOB
。最终,随着进程运行,table 将被锁定。当我们的 DBA 检查连接时,我似乎在 table 上创建了多个锁,并且没有来自其他用户的其他连接。关于为什么下面的代码最终会在 table 上创建锁的任何想法?在创建锁之前,通常需要几天的时间将这段代码 运行 每天重复 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();
}
}
}
}
试试这个代码。注意,你要保存的是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();
}
}
}
我正在将格式化文本写入 Oracle table 中的 CLOB
。最终,随着进程运行,table 将被锁定。当我们的 DBA 检查连接时,我似乎在 table 上创建了多个锁,并且没有来自其他用户的其他连接。关于为什么下面的代码最终会在 table 上创建锁的任何想法?在创建锁之前,通常需要几天的时间将这段代码 运行 每天重复 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();
}
}
}
}
试试这个代码。注意,你要保存的是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();
}
}
}