设置
我创建了一个针对 .NET 4.7.2 的控制台应用程序,并安装了 NuGet 包Oracle.ManagedDataAccess版本 12.2.1100(最新/当前),它设置了一个依赖项,其中包含 2 个查询来监视对 所做的更改MYTABLE
,两个查询都有不同的 WHERE -条款。
我要连接的 Oracle 数据库服务器在 localhost 上运行,版本为 12.2.0.1.0。
在侦听通知的控制台应用程序旁边,我使用 Oracle SQL Developer (v18.1.0.095) 将记录实际插入或更新到 MYTABLE 以强制通知。
代码
using (var connection = new OracleConnection("Data Source=//localhost:1521/ORCL;Persist Security Info=True;User ID=SYSTEM;Password=password"))
{
OracleDependency.Port = 3005;
var dependency = new OracleDependency();
dependency.OnChange += (sender, eventArgs) =>
{
Console.WriteLine($"Change count: {eventArgs.Details.Rows.Count}");
// Columns in row: string ResourceName, int Info, string Rowid, long QueryId
foreach (DataRow row in eventArgs.Details.Rows)
{
var resourceName = (string)row["ResourceName"];
var info = (OracleNotificationInfo)row["Info"];
var rowId = (string)row["rowid"];
var queryId = (long)row["QueryId"];
Console.WriteLine($"{queryId} {info} {rowId} {resourceName}");
}
};
connection.Open();
var command1 = new OracleCommand("SELECT * FROM MYTABLE WHERE NAME = 'N1'", connection);
dependency.AddCommandDependency(command1);
command1.Notification.IsNotifiedOnce = false;
command1.AddRowid = true;
command1.ExecuteNonQuery();
var command2 = new OracleCommand("SELECT * FROM MYTABLE WHERE NAME = 'N2'", connection);
dependency.AddCommandDependency(command2);
command2.Notification.IsNotifiedOnce = false;
command2.AddRowid = true;
command2.ExecuteNonQuery();
Console.ReadKey();
}
行为
一旦我在一个事务中触发多个命令依赖项,我就会在通知中获得两倍的事件行,并且无法再区分触发它的 queryid。
在一个事务中运行此查询:
INSERT INTO MYTABLE (NAME) VALUES ('N1');
输出:
Change count: 1
63 Insert AAAR6CAABAAALohABJ SYSTEM.MYTABLE
在一个事务中运行此查询:
INSERT INTO MYTABLE (NAME) VALUES ('N2');
输出:
Change count: 1
64 Insert AAAR6CAABAAALohABK SYSTEM.MYTABLE
但是,在一个事务中运行此查询时:
INSERT INTO MYTABLE (NAME) VALUES ('N1');
INSERT INTO MYTABLE (NAME) VALUES ('N2');
我得到这个输出:
Change count: 4
63 Insert AAAR6CAABAAALohABH SYSTEM.MYTABLE
63 Insert AAAR6CAABAAALohABI SYSTEM.MYTABLE
64 Insert AAAR6CAABAAALohABH SYSTEM.MYTABLE
64 Insert AAAR6CAABAAALohABI SYSTEM.MYTABLE
虽然我期望:
Change count: 2
63 Insert AAAR6CAABAAALohABH SYSTEM.MYTABLE
64 Insert AAAR6CAABAAALohABI SYSTEM.MYTABLE
此外,当我执行INSERT
触发第一个命令和UPDATE
触发第二个命令的操作时,我得到 4 行,第一个 QueryId (63) 和+INSERT
用于第二个 QueryId (64),所以现在我可以区分它们了。UPDATE
INSERT
UPDATE
将命令依赖关系分离到多个OracleDependency
类甚至多个连接会导致相同的结果。
我想知道是否有人知道这里发生了什么?