有一个数据表中的数据是在不停地发生变化(进入新的数据)
然后有两个主机的线程不停地循环扫描操作新进入这个表的数据
为了防止两个主机同时对同一批数据进行操作,采用了悲观锁的方式
例如:select * from A where rownum <=15 for update nowait
然后更新数据 update A set state='end'的方式将锁释放掉
但是现在出现了数据被锁住,一台主机的update A set state='end'语句执行不过去
另外一台主机不停地报这个错:
nested exception is java.sql.SQLException: ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源  at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.translate(SQLErrorCodeSQLExceptionTranslator.java:296)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:382)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:433)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:441)
at com.firsttech.underwriting.dao.impl.CPICBatchDaoImpl.getPolicyMessage(CPICBatchDaoImpl.java:51)
at com.firsttech.underwriting.scheduler.BatchUWService04.executeInternal(BatchUWService04.java:36)
at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:86)
at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:525)
急求高手指点问题原因,谢谢!

解决方案 »

  1.   

    1、查看锁表的session_id
    select session_id from v$locked_object;2、查询这个session的信息
    SELECT sid, serial#, username, osuser FROM v$session where sid = &session_id;3、杀掉这个进程 alter system kill session 'sid,serial#';
      

  2.   

    事务提交,commit;
    否则锁不释放
      

  3.   

    使用了悲观锁之后有使用update更新数据 update A set state='end'
    更新之后有commit呢另外,如果不使用for update的形式,可否有其他方式来避免不同线程对同一批数据进行操作