我的目标是:
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
答案 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
}