我正在使用 TransactionScope 对 Entity Framework 和 Oracle Advanced Queue 执行一些操作。在本地机器上我没有问题,我的一些同事有。生产机器出现问题。问题是当我将一条消息排入队列时,它似乎没有被插入到表队列中。在 IIS 的应用程序池超时或进行手动回收后,行出现在表中。
using (var ctx = new EFContext())
{
using (var ts = new TransactionScope())
{
// Perform some EF operations
ctx.SaveChanges();
MyEnqueuer enq = new Enqueuer();
enq.Enqueue();
ts.Complete();
}
}
MyEnqueuer 类的方法:
using (var _cn = new Oracle.DataAccess.Client.OracleConnection(_cs))
{
using (OracleAQQueue _queueObj = new OracleAQQueue(_queueCs, _cn))
{
_cn.Open();
_queueObj.MessageType = OracleAQMessageType.Raw;
OracleAQMessage _msg = new OracleAQMessage();
_msg.Payload = _evento.ToByteArray();
_queueObj.EnqueueOptions.Visibility = OracleAQVisibilityMode.OnCommit;
_queueObj.Enqueue(_msg);
_cn.Close();
}
}
正如我所说,执行 ts.Complete 时,oracle 队列中没有任何反应。当 iis 池应用程序被回收或超时时插入行。
在本地我有 IIS 10,而不是在生产中我在 Windows Server 2008 R2 上有一个 IIS 6.1
我正在使用 .Net Framework 4.5,应用程序是 x64 编译的。EntityFramework 使用 Oracle ManagedDataAccess,如您所见,AOQ 使用 Oracle DataAccess Client。
笔记。问题停留在 Web 应用程序中,因为创建了一个测试控制台应用程序,一切正常。