首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OracleCommand超时

OracleCommand超时
EN

Stack Overflow用户
提问于 2012-09-30 10:48:38
回答 1查看 18.1K关注 0票数 1

ODP.NET OracleCommand.CommandTimeout文档

默认为0秒,这没有时间限制。 当指定的超时值在命令执行结束前过期时,该命令将尝试取消。如果取消成功,则引发带有ORA-01013:用户请求取消当前操作的消息的异常。如果命令在没有任何错误的情况下及时执行,则不会引发异常。 在多个OracleCommand对象使用相同连接的情况下,其中一个OracleCommand对象的超时过期可能会终止单个连接上的任何执行。要使OracleCommand cancel的超时过期仅执行它自己的命令,只需对每个连接使用一个OracleCommand,如果OracleCommand将CommandTimeout属性设置为大于0的值。

但是像这样的代码是有效的:

代码语言:javascript
复制
static void Main(string[] args)
{
    OracleConnection conn = null;
    try
    {
        string connString =
            "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=myOracleHost)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=myServiceName)));User Id=system;Password=admin;Pooling = False;";
        string cmdString1 = "UPDATE employee SET empname = 'temp1' where id = 1";
        string cmdString2 = "Update employee set empname = 'temp2' where id = 2";
        conn = new OracleConnection(connString);
        var cmd1 = new OracleCommand(cmdString1, conn);
        cmd1.CommandTimeout = 30;
        var cmd2 = new OracleCommand(cmdString2, conn);
        cmd2.CommandTimeout = 30;
        conn.Open();
        try
        {
            //Locked the row with ID 1 with an uncommitted update operation outside this code
            cmd1.ExecuteNonQuery();
        }
        catch (Exception exception)
        {
            //Exception ORA-01013 Thrown as expected
        }
        try
        {
            //As per the documentation, this should not also work since this command object also uses the same connection as above and it timed out in the query above
            cmd2.ExecuteNonQuery();
            //But this still works fine. 
        }
        catch (Exception)
        {
            //no exception
        }
    }
    finally
    {
        conn.Close();
    }
}

对于两个命令对象,我使用相同的OracleConnection对象-- cmd1cmd2,以及cmd1已经超时(如预期的那样)。但是,根据文档,cmd2也不应该运行。但是它仍然毫无例外地运行,并正确地更新另一行。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-01 15:12:32

您没有在连接上运行多个命令,而是有两个命令依次运行。当第一个命令超时时,连接上没有其他挂起的命令。在第一个命令成功或引发异常之后,您的代码才会提交第二个命令以供执行。

您引用的文档的最后一段应该是:在多个OracleCommand对象使用相同的连接OracleCommand的情况下.

代码语言:javascript
复制
static void Main(string[] args)
{
    using (var conn = new OracleConnection("Pooling=False;...")) // why?
    using (var cmd1 = conn.CreateCommand())
    using (var cmd2 = conn.CreateCommand())
    {
        cmd1.CommandText = "UPDATE employee SET empname = 'temp1' WHERE id = 1";
        cmd2.CommandText = "UPDATE employee SET empname = 'temp2' WHERE id = 2";
        cmd1.CommandTimeout = 30;
        cmd2.CommandTimeout = 30;

        conn.Open();

        // there are no commands on conn yet

        try { cmd1.ExecuteNonQuery(); } // cmd1 is the only command on conn
        catch (OracleException) { } // if timeout, no other command affected

        // cmd1 is no longer on conn

        try { cmd2.ExecuteNonQuery(); } // cmd2 is the only command on conn
        catch (OracleException) { } // if timeout, no other command affected

        // cmd2 is no longer on conn
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12660636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档