在我的程序中,SELECT SENSOR_ID, B.REPVALUE, B.METTIME
        FROM BRN_YXJX_RT_SENSORS S
        JOIN CMETVALUE1_YBDL B ON S.TAG1 = B.METID  
         AND B.METTIME > :b1
         AND B.VALUETYPE = 1
       WHERE S.READ_FROM = 3
         AND S.SENSOR_ID = :b2
       执行这个sql语句的进程每运行一个小时就死锁了,并且每次在oracle里显示的时间(登陆时间,上次活动时间间隔)都是1小时一次,锁类型:TX,占用模式Exclusive,请求的模式:NONE 对象名等等都是空白的。
         这个sql语句在pl/sql里加上参数执行,只用了0.4秒,CMETVALUE1_YBDL 这个表是通过dbLink连接的其他数据库,是某个表的同义词。
        为何我这个sql语句会产生锁呢?每次kill掉以后,总是在那个oracle锁列表里挺着,一直不消失,这是为啥呢?
        请高手分析一下。

解决方案 »

  1.   

    在dblink中,select也算个事务,所以你做完这个查询后,commit一下。
      

  2.   

    oracle查询语句没有锁
    除非你这么写,SELECT A,B,C FROM TEST WHERE A=1 FOR UPDATE
      

  3.   

    oracle查询语句没有锁,因该是速度慢
      

  4.   

    做为事务是要分配回滚段的吧?
    这个DBLINK的SELECT 会分配回滚段吗?
    至少我在10G里应用DBLINK之后跨库查询并不会出现锁的问题,而且我觉得这个问题也不是事务的问题.
      

  5.   

    回滚段是啥啊,我之前没咋注意。
    分配回滚段又如何呢?我的这个select语句写在 for语句之内,类似于 for (select )loop 一条条插入 endloop;其实我每插入一条就commit了
    原来使用的是  insert 表 select。。,结果产生的锁压根删不掉 我以为这个批量插入有问题,就改成上面的了,
    这个程序1-2月份并没问题,现在突然老是死锁了