情况如下  2个进程 分别 提交 事务 对一主表 一从表 分别进行 insert (2表有外键关联)
先对主表 insert,事务1 挂起 , 再启动另一个 事务2 对从表 insert,无反应背景 : oracle 10g 里事务 默认超时 60秒,websphere v5.1 连接池 超时180秒  事务超时120秒  这个事务逻辑 是有点问题  , 但是问题是 无log 无错误 提示   不显示 任何超时,无论oracle和websphere所有 事务 都在10分钟左后 后 无反应 有表内容可以推测 应该事务是回滚了,但是无log 无异常 
无法得知 如何造成 无log 我们怀疑 是 连接池 已经 超时 所以无法返回  ,问题是为什么oracle的事务超时无效  websphere的事务超时 也无效 
请问还有什么地方可以阻塞该事务的操作呢? 和为什么无任何log ?在开发环境无法重现 该错误 ,因为oracle 的事务 超时 一定会先报错...
出现如下错误:
java.sql.SQLException: ORA-02049: timeout: distributed transaction waiting for lock
我曾经查到一个itl死锁,但是根据那位bloger的意思,在10g需要4线程 才可能造成死锁。

解决方案 »

  1.   

    应该是死锁了。
    死锁会生成一个trace文件, 
    在alert日志中可看到,死锁的时候都会产生一个ora-00060错误.
      

  2.   

    >情况如下  2个进程 分别 提交 事务 对一主表 一从表 分别进行 insert (2表有外键关联) 先对主表 insert,事务1 挂起 , 再启动另一个 事务2 对从表 insert,无反应
    你的主从表,那个关联的字段没加索引吧?不过insert似乎不会阻塞呀,做个实验先
      

  3.   

    >情况如下  2个进程 分别 提交 事务 对一主表 一从表 分别进行 insert (2表有外键关联) 
    先对主表 insert,事务1 挂起 , 再启动另一个 事务2 对从表 insert,无反应试验一把:
      如果只有 insert, 事务1是不会被阻塞的。楼主有update,delete操作吧?并且你的表的这个关联字段未加索引
      

  4.   

    不会啊...我们的数据是分日期的,每次都只是插入新数据,旧数据会有其他事务定时删除的 
    我会去找下DBA 要看下alert日志, 但是 说是无任何log....有无索引 我去确认一下 ,谢谢楼上各位
      

  5.   

    3楼的朋友,我 自己开发环境 是一定会报 死锁的 
    部署地点在国外,这个alert日志 还比较难拿.... 继续等等了。希望 也不知道哪里的dba啥水平....
      

  6.   

    主表的transaction没有commit 的情况下,又再insert子表。逻辑上来讲应该会阻塞吧。
    现在的问题是我在开发环境试:oracle 的事务超时是distributed_lock_timeout = 60s,websphere v5.1 连接池 超时180秒  事务超时120秒
    开发环境60s的时候肯定报下面的exception 。服务器上跑的时候却老是什么错误log都没有,让我很是郁闷啊。alert日志我还没查,服务器在国外查日志
    要找他们那边很麻烦。
    我现在只能把子表的外键去掉,去掉后就不再报错。还好这个外键并不重要。
    可是无法重现服务器的问题总是不安心,怀疑可能有其他问题。java.sql.SQLException: ORA-02049: timeout: distributed transaction waiting for lock
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:111)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:330)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:287)
    at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:742)
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:215)
    at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:954)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1167)
    at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3284)
    at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3367)
     com.ubs.james.core.intf.dsv.jdbc.IJdbcService$Exception: Error when executing sql statement
    at com.ubs.james.core.impl.dsv.jdbc.JdbcService.execute(JdbcService.java:387)
    at com.ubs.james.core.impl.dsv.jdbc.JdbcService.update(JdbcService.java:617)
    at com.ubs.james.core.impl.dsv.jdbc.SQLUpdate.doExecuteInternal(SQLUpdate.java:33)
    at com.ubs.james.core.impl.dsv.jdbc.SQLBase.executeInternal(SQLBase.java:451)
    at com.ubs.james.core.impl.dsv.jdbc.SQLBase._execute(SQLBase.java:273)
    at com.ubs.james.core.impl.dsv.jdbc.SQLBase.execute(SQLBase.java:497)
    at com.ubs.james.core.impl.dsv.jdbc.BeanMappingSQLUpdate.execute(BeanMappingSQLUpdate.java:102)
    at com.ubs.ifop.service.chddsi.core.dsv.impl.ChdXchgRateDSV.insert(ChdXchgRateDSV.java:94)
    at com.ubs.ifop.service.chddsi.core.dsv.impl.ChdXchgRateDSV.insert(ChdXchgRateDSV.java:121)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:85)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:58)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java(Compiled Code))
    at java.lang.reflect.Method.invoke(Method.java(Compiled Code))
    at com.ubs.james.core.impl.ServiceManager$ServiceProxy.invokeBusinessService(ServiceManager.java:360)
    at com.ubs.james.core.impl.ServiceManager$ServiceProxy.invoke(ServiceManager.java:487)
    at com.ubs.james.core.impl.dsv.DataServiceManager$Proxy.invoke(DataServiceManager.java:84)
    at $Proxy11.insert(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:85)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:58)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java(Compiled Code))
    at java.lang.reflect.Method.invoke(Method.java(Compiled Code))
    at com.ubs.ifop.service.chddsi.core.logging.PerformanceLoggingHandler.invoke(PerformanceLoggingHandler.java:41)
    at $Proxy11.insert(Unknown Source)
    at com.ubs.ifop.service.chddsi.core.message.command.BatchTableUpdateCommand.update(BatchTableUpdateCommand.java:57)
    at com.ubs.ifop.service.chddsi.core.message.command.BatchTableUpdateCommand.execute(BatchTableUpdateCommand.java:29)
    ... 30 more
      

  7.   

    >我现在只能把子表的外键去掉,去掉后就不再报错。还好这个外键并不重要这就是说你的外键没加索引洛?《oracle9i10g编程艺术》看锁的那一章