多个连接,会话状态

时间:2012-06-26 11:02:43

标签: c# .net oracle

我的目标是:

  • 1个持久数据库连接和事务,用于插入/更新数据,并且可以在完成所有工作后提交或回滚

  • “at-will”打开不相关的连接,这些连接不与持久连接共享会话状态 - 这意味着他们“看到”旧数据。这些连接只需要读取,而不是写入。

我尝试打开一个全新的连接,但它看到了持久连接所做的更改。这有可能实现吗?

注意:我对所有连接使用相同的Oracle用户名/密码。

注意2:Toad(Oracle DB软件)在提交之前不会“看到”持久连接所做的更改。如果它们被回滚,它们不会出现在数据库中,当它们被提交时,它们会被提交。这部分工作正常,只是从我的应用程序打开的其他连接在提交之前看到它们。

以下是我的连接代码,它看到了应该看不到的更改:

using (OracleConnection readConnection = new 
       OracleConnection(Settings.OracleConnectionString))
{
    readConnection.Open();

    using (OracleCommand command = new OracleCommand(lastOracleRowQuery, 
                                                     readConnection))
    {
        using (OracleDataReader reader = command.ExecuteReader())
        {
            if (reader.Read())
            {
                for (int i = 0; i < reader.FieldCount; i++)
                    compareValues.Add(reader.IsDBNull(i) ? 
                        null : 
                        reader.GetValue(i));
            }
        }
    }
}

当另一个OracleConnection打开时,会发生这种情况,以及使用该连接的事务。但是,readConnection不应该完全不相关吗?

此读取的结果给出了在Toad中同时使用相同查询时不会出现的结果。

解决

显然, Oracle在“CREATE TABLE”上提交会话,即使create table失败,什么都不做并抛出异常。我没想到这种行为所以这让我很困惑。当我在开始时创建所有表创建时,一切都开始工作了。在我的测试过程中实际上没有创建表格,所以我认为这不是问题,但是当我清理代码并将它们移动到开始时,一切都自行修复。

我仍然不明白蟾蜍的情况如何。我可能弄错了什么。或者还有更多我还没有意识到的错误。 :d

1 个答案:

答案 0 :(得分:0)

如果您正在使用System.Transaction.TransactionScope,那么在作用域内创建的所有连接都将被视为单个事务,因此您的持久连接创建的数据将对读取连接可见。

您应该在当前范围内创建一个新的TransactionScope,并将scope选项作为TransactionScopeOption.Suppress,在该范围内创建读取连接,并在该新范围内执行读取操作。您的代码如下所示。

//Outer Transaction        
using (TransactionScope t = new TransactionScope())
{
        //Create persistence connection and command
        // Execute persistence commands
        //Inner scope to suppress the outer transaction
    using (TransactionScope t1 = new TransactionScope(TransactionScopeOption.Suppress))
    {
        //create read connection
        // Execute read operation
    }
    //continue with write operation
}