Oracle死锁
1、什么是死锁
死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态。死锁产生有四个必要的条件:互斥条件,不可剥夺条件,部分分配,循环等待,这四个条件不是充分条件,即使这四个条件同时存在,系统也不一定发生死锁,但系统一但发生死锁,这四个条件一定是满足的。
死锁产生的必要条件是:
1.互斥条件:系统中存在一个资源一次只能被一个进程所使用;
2.非抢占条件:系统中存在一个资源仅能被占有它的进程所释放,而不能被别的进程强行抢占。
3.占有并等待条件:系统中存在一个进程已占有了分给它的资源,但仍然等待其他资源。
4.循环等待条件:在系统中存在一个由若干进程形成的环形请求链,其中的每一个进程均占有若干种资源中的某一种,同时每个进程还要求(链上)下一个进程所占有的资源。
在ORACLE中,为了保证数据的一致性,在对数据库中的数据进行操作时,系统会进行对数据相应的锁定。
当程序对所做的修改进行提交(commit)或回滚后(rollback)后,锁住的资源便会得到释放,从而允许其它用户进行操作。
2、死锁测试
--创建表
CREATE TABLE DLTEST
(
CID CHAR(10),
CVALUE1 CHAR(10),
CVALUE2 CHAR(10)
);
--插入两条数据
INSERT INTO DLTEST (CID, CVALUE1, CVALUE2) VALUES ('1', '1', '1');
INSERT INTO DLTEST (CID, CVALUE1, CVALUE2) VALUES ('2', '2', '2');
COMMIT;
--打开一个sqlplus(session1),执行以下语句
update dltest set cvalue1 = '1' where cid = '1';
--再打开一个sqlplus(session2),执行以下语句
update dltest set cvalue2 = '2' where cid = '2';
--session1中执行以下语句
update dltest set cvalue1 = '2' where cid = '2';
--session2中执行以下语句
update dltest set cvalue2 = '1' where cid = '1';
--此时session1会报错“ORA-00060: 等待资源时检测到死锁”
3、死锁分析
在oracle日志中,会对死锁进行详细的日志记录,%ORACLE_BASE%/admin/orcl/bdump/alert_<SID>.log文件,该文件中记录指定了日志信息文件。日志中记录了发生死锁的SQL语句。
如果oracle发生了死锁,会自动回滚事务中的当前语句! ......
死锁分析
最新推荐文章于 2024-06-02 20:25:36 发布