oracle两个不同的会话

oracle两个不同的会话,oracle,session,locking,Oracle,Session,Locking,在我们的工作中,我们创建了两个.net侦听器, 第一个: 调用使用insert into select语法将大量数据插入表(表1)的oracle存储过程: 在表1中插入选择c1、c2。。。从tbl2内部连接tbl3。。。。 然后我们使用显式提交 第二个听众: 调用通过listener1读取插入到表1中的数据的oracle过程 但我们注意到,即使是插入到table1 listener2中的记录也无法在使用commit的同时看到该记录 我的问题是,当我们使用insert…select时,cmmit是

在我们的工作中,我们创建了两个.net侦听器, 第一个: 调用使用insert into select语法将大量数据插入表(表1)的oracle存储过程: 在表1中插入选择c1、c2。。。从tbl2内部连接tbl3。。。。 然后我们使用显式提交

第二个听众: 调用通过listener1读取插入到表1中的数据的oracle过程

但我们注意到,即使是插入到table1 listener2中的记录也无法在使用commit的同时看到该记录

我的问题是,当我们使用insert…select时,cmmit是如何工作的? 此问题是否与会话有关?当侦听器1会话结束侦听器2可以读取数据时

请帮忙


提前感谢。

您使用了错误的术语

侦听器是一个服务器应用程序,它侦听传入的客户端请求并将其交给DB引擎。客户端未使用侦听器

会话与您可以看到的数据无关,事务是控制该会话的对象

Oracle的工作方式非常明确—在事务提交后—所有新事务都可以看到它,并且现有事务可以根据it事务配置看到新内容。
我建议您在该上下文中阅读有关隔离级别的内容

默认情况下-事务提交的时刻(在DB中由SCN定义)-数据对客户端可见。

底线-您的问题与事务隔离级别(如果在提交之前开始读取事务)或写入程序相关,写入程序在您认为是数据时不提交数据(事务问题)。
在.net中对transaction.Commit()的调用返回后-数据已经可见,其他事务正在看到它。

第二个问题是提交是如何工作的。
这在Oracle中是一个非常复杂的过程,因此我将给出一个非常简短的描述:
1.提交时,Oracle首先在提交本身之前运行一些验证(例如,运行延迟约束)。
2.oracle知道可以安全地提交更改后,将获得系统时间(SCN),将提交本身写入重做日志,并将数据刷新到磁盘(以保持一致性)。
3.向用户发送确认信息,确认数据已对世界可见。
4.将缓冲区标记为可用


我想添加一些东西,只是为了确保(我正在半个睡眠时间编写它-所以如果它没有编译请原谅…) 在您的.net代码中-您的代码在逻辑上应与之等效:

OracleConnection con = new OracleConnection(connStr);
con.Open();

OracleTransaction trans = con.BeginTransaction();

OracleCommand cmd = con.CreateCommand();
cmd.Connection = cmd;
cmd.CommandText = "insert into ...";
cmd.ExecuteNonQuery();
cmd.Dispose();

trans.Commit();
trans.Dispose();

con.Close();
con.Dispose();
如果使用LINQ,请确保在正确的区域创建事务范围