日期:2014-05-17  浏览次数:20893 次

oracle10g 急求悲观锁问题
有一个数据表中的数据是在不停地发生变化(进入新的数据)
然后有两个主机的线程不停地循环扫描操作新进入这个表的数据
为了防止两个主机同时对同一批数据进行操作,采用了悲观锁的方式
例如: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、查看锁表的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#';
------解决方案--------------------
事务提交,commit;
否则锁不释放