更新查询时 ODP .NET 语句超时

ODP .NET statement timeout on update query

问题:

基本上,出于某种原因,更新语句会无休止地等待(ExecuteNonQueryAsync())。 Insert 工作得很好,我试图用硬编码参数硬编码一个简单的更新语句(没有 merge), 同样的故事,甚至试图删除 where 子句并更新所有行,同样的问题。

commandTimeout 设置为 1 后,我设法识别 TimeoutException,为什么会这样?我不知道。

编辑: 剧情转折。 现在我有随机成功的更新,这让我更加茫然。 我基本上尝试了所有我能想到的可能场景来识别问题中存在的任何模式,我唯一的结论是更新成功率是完全随机的...

仍然插入工作正常。


这是简化的代码部分。

public class CipCheckRepository : ICipCheckRepository
{
    private string connectionString = "Data Source=****;User Id=****;PASSWORD=****;Persist Security Info=True;";

    public CipCheckRepository()
    {}

    public async Task InsertOrUpdate(CipCheck cipCheck)
    {
        using (var uow = new UnitOfWork(connectionString))
        {
            using (var cmd = uow.CreateCommand())
            {
                cmd.CommandText = @"
                    MERGE INTO test
                    USING dual
                        ON (id = :CAD_ID)
                    WHEN MATCHED THEN
                        UPDATE SET value = :ISRA_NUMBER
                    WHEN NOT MATCHED THEN
                        INSERT
                        (
                            id,
                            value
                        )
                            VALUES
                        (
                            :CAD_ID,
                            :ISRA_NUMBER
                        )";

                cmd.Parameters.AddWithValue("CAD_ID", 1);
                cmd.Parameters.AddWithValue("ISRA_NUMBER", cipCheck.IsraNumber);

                cmd.CommandTimeout = 1;

                try
                {
                    await cmd.ExecuteNonQueryAsync();
                }
                catch (OracleException ex)
                {
                    System.Diagnostics.Debug.WriteLine(ex.Message);
                }
            }
        }
    }

UnitOfWork class 是为抽象问题创建的。

如何确定永无止境查询的原因以及可以采取哪些措施来防止它?

似乎我一直在以某种方式锁定 table,在通过 Oracle Developer 提交所有语句后,怪癖消失了。