2013-02-20 53 views
0

您好我在数据库重新启动后登记到分布式事务有问题。无法在数据库重启后登记分布式事务

我的环境:

  • 的Windows 7 64位与SP1
  • Oracle数据库11g Express Edition的
  • ODP.NET 4.112.3.0

我的程序:

const string connectionString = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=LOCALHOST)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=XE)));User Id=system;Password=sasa;"; 

static void Main(string[] args) 
{ 
    using (TransactionScope scope = new TransactionScope()) 
    { 
     while (true) 
     { 
      using (OracleConnection connection = new OracleConnection(connectionString)) 
      { 
       try 
       { 
        connection.Open(); 
        Console.WriteLine("Connection opened"); 
       } 
       catch (Exception ex) 
       { 
        Console.WriteLine(ex.Message); 
       } 
      } 
      Thread.Sleep(1000); 
     } 
    } 
} 

所有作品在应用后都很棒开始。当我开始停止数据库时,我得到NRE和一些异常告诉我数据库关闭正在进行中。再次启动后,我收到错误 - 无法登记分布式事务。打开的连接不再打印。

输出:

Connection opened 
Connection opened 
Connection opened 
Connection opened 
Connection opened 
-- here I'm stopping database 
ORA-12518: TNS:listener could not hand off client connection 
ORA-12528: TNS:listener: all appropriate instances are blocking new connections 
-- here database is stopped I suppose 
ORA-12514: TNS:listener does not currently know of service requested in connect descriptor 
-- here I'm starting database again 
ORA-12528: TNS:listener: all appropriate instances are blocking new connections 
ORA-1033: ORACLE initialization or shutdown in progress 
Unable to enlist in a distributed transaction 
Unable to enlist in a distributed transaction 
Unable to enlist in a distributed transaction 
Unable to enlist in a distributed transaction 
Unable to enlist in a distributed transaction 
... 
  • 什么是行为的原因是什么?
  • 如何诊断发生了什么?
+0

你说“之后” - 这是否意味着它最终有效?数据库是在windows还是linux/unix上运行? – 2013-02-20 22:06:06

+0

客户端和服务器都运行在同一台计算机上 - Windows 7 x64,并且所有工作都很好,直到服务器服务重新启动 – 2013-02-21 09:36:38

+0

它在什么时候工作很好?重启后?过了一段时间?另外,打印整个异常(Console.WriteLine(ex.ToString()))。内部异常中可能会有其他数据。 – 2013-02-21 12:47:06

回答

1

您有一个无效的测试。您正在循环里面的单个事务的上下文。当数据库关闭时,任何正在进行的分布式事务都会中止。你的循环试图在已经死掉的事务之下建立一个新的连接。

我不确定你想要测试的是什么,但移动While循环内的TransactionScope应该修复它。

+0

你说得对,我在测试中有bug - 谢谢。 – 2013-02-22 15:35:51

+0

任何引用都支持您的语句“当数据库关闭时,任何正在进行的分布式事务都会中止....”?另外,如果你有任何关于事务的好引用以及在不同场景下的多个dbcontext(s),单个作用域vs多个作用域,单个线程vs多个线程......。 – 2017-06-29 23:38:03

+0

我猜怎么可能是其他的东西?默认是放弃,如果db不可用来完成2PC,它将会回滚。 System.Transactions有一个用于多线程的DependentTransaction类。 – 2017-06-30 13:55:41