oracle 锁表原因

javalead 2008-07-16 03:02:17
在oracle数据库中对一张表的记录先查询出来,然后做更新操作,现在在数据量大的情况下老是锁住了记录,请问是不是我的程序原因造成的,如果是该怎么解决?
...全文
2564 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
manbufenglin 2008-07-17
  • 打赏
  • 举报
回复
杀死"Oracle"死锁进程的具体步骤:

  1.查哪个过程被锁

  查V$DB_OBJECT_CACHE视图:

  

  SELECT * FROM V$DB_OBJECT_CACHE

  WHERE OWNER='过程的所属用户' AND CLOCKS!='0';



  2. 查是哪一个SID,通过SID可知道是哪个SESSION.

  查V$Access视图:

  

  SELECT * FROM V$ACCESS WHERE

  OWNER='过程的所属用户' AND NAME='刚才查到的过程名';



  3. 查出SID和SERIAL#

  查V$SESSION视图:

  

  SELECT SID,SERIAL#,PADDR FROM

  V$SESSION WHERE SID='刚才查到的SID'

 

  查V$PROCESS视图:

  

  SELECT SPID FROM V$PROCESS

  WHERE ADDR='刚才查到的PADDR';

 
  

  4. 杀进程

  (1).先杀Oracle进程:

  

  ALTER SYSTEM KILL SESSION '查出的SID,查出的SERIAL#';

  
  (2).再杀操作系统进程:

  KILL -9 刚才查出的SPID

  或

  ORAKILL 刚才查出的SID 刚才查出的SPID。
xiangle99431 2008-07-16
  • 打赏
  • 举报
回复
在UPDATE之前先判断是否这条数据在修改
  • 打赏
  • 举报
回复
并发
死锁
chenhongxin 2008-07-16
  • 打赏
  • 举报
回复
userB执行select * from 表名 for update of 字段 no wait 10;
这时虽然纪录被userA锁定但是userB会等待10秒如果10秒内userA释放

select * from student for update of age no wait 100
dbcxbj 2008-07-16
  • 打赏
  • 举报
回复
userA锁住一条纪录
userB锁住一条纪录
userA请求锁住userB正在锁住的纪录
而同时userB请求锁住userA正在锁住的纪录
这时候就会产生死锁
dbcxbj 2008-07-16
  • 打赏
  • 举报
回复
那就是并发产生死锁了

javalead 2008-07-16
  • 打赏
  • 举报
回复
我没有用FOR UPDATE 锁表, 就是有时候会锁住一条记录,不知道是什么原因?
dbcxbj 2008-07-16
  • 打赏
  • 举报
回复
比如有两个用户一个userA,一个userB
当userA发出 select * from 表名 for update of 字段 时
这是纪录被锁住等待更新
当userB此时也发出select * from 表名 for update of 字段 时
并且for update of 的纪录已经被userA锁定
这是userB只能等待userA提交后才能获取到userA被占用的纪录
如果userA不提交userB就会无限期的等待
解决方法
userB执行select * from 表名 for update of 字段 no wait 10;
这时虽然纪录被userA锁定但是userB会等待10秒如果10秒内userA释放
了纪录,则userB获取该锁,如果10秒后userA未释放锁,则userB返回
错误消息
ora-30006:资源已被占用;执行此操作时出现wait超时


dbcxbj 2008-07-16
  • 打赏
  • 举报
回复
估计你是用for update of了
这样别人用的时候只能等待锁被释放,要不只能无限制的等待...

17,082

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧