比如有两个用户一个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超时
userB执行select * from 表名 for update of 字段 no wait 10; 这时虽然纪录被userA锁定但是userB会等待10秒如果10秒内userA释放 select * from student for update of age no wait 100
在UPDATE之前先判断是否这条数据在修改
杀死"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。
这样别人用的时候只能等待锁被释放,要不只能无限制的等待...
当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超时
userB锁住一条纪录
userA请求锁住userB正在锁住的纪录
而同时userB请求锁住userA正在锁住的纪录
这时候就会产生死锁
这时虽然纪录被userA锁定但是userB会等待10秒如果10秒内userA释放 select * from student for update of age no wait 100
4. 杀进程 (1).先杀Oracle进程: ALTER SYSTEM KILL SESSION '查出的SID,查出的SERIAL#';
(2).再杀操作系统进程: KILL -9 刚才查出的SPID 或 ORAKILL 刚才查出的SID 刚才查出的SPID。