欢迎来到天天文库
浏览记录
ID:40563551
大小:32.00 KB
页数:5页
时间:2019-08-04
《oracle死锁原因分析》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、oracle死锁原因分析死锁的原因1。模拟死锁1。1。主表--CreatetablecreatetableWDZ1( WDZ1IDNUMBERnotnull, MEMO VARCHAR2(20));altertableWDZ1 addconstraintXXXXXXprimarykey(WDZ1ID);1。2。从表(没有外健的索引)--CreatetablecreatetableWDZ2( WDZ2IDNUMBERnotnull, WDZ1IDNUMBER, MEMO VARCHAR2(20));--Create/Recreateprimary,uniqueandforeign
2、keyconstraintsaltertableWDZ2 addconstraintXXXXXprimarykey(WDZ2ID);altertableWDZ2 addconstraintXXXforeignkey(WDZ1ID) referencesWDZ1(WDZ1ID);1。3。插入数据表到住表begininsert intowdz1values(1,'aa');insert intowdz1values(2,'aa2');insert intowdz1values(3,'aa3');insertintowdz2values(10,3,'wdz3--1');commit;en
3、d;1。4。在一个数据库seeesion里面插入数到从表,但是不提交事务begin updatewdz2 setmemo='updatewdz2momo' wherewdz2id=10;insertintowdz2values(20,2,'wdz2--1');end;对从表进行插入/修改记录,施加的锁也就是行级锁1。5。在另外一个数据库seeesion里面删除主表数据deletefromwdz1wherewdz1id=1这时候程序会死锁,除非上面的对从表的数据操作提交事务或者回滚事务。2。具体原因分析一个数据表的外键主要有3种方式来维护它自己和主表数据的一致性。(1)deletecasc
4、ade例子如下:altertableWDZ2 addconstraintXXXforeignkey(WDZ1ID) referencesWDZ1(WDZ1ID)ondeletecascade;(2)Setnull例子如下:altertableWDZ2 addconstraintXXXforeignkey(WDZ1ID) referencesWDZ1(WDZ1ID)ondeletesetnull;(3)Noaction注意,这是oracle外键使用时候的默认选项。例子如下:altertableWDZ2 addconstraintXXXforeignkey(WDZ1ID) refere
5、ncesWDZ1(WDZ1ID);以前出现死锁主要是我们认为,在1。4。会对数据表wdz2进行施加行级锁,但是从表(wdz2)的外健是Noaction,删除主表(wdz1)不会去访问从表,更不会去锁定wdz2表的记录或者对整个数据从表(wdz2)施加表级锁。事实上oralce的Noaction选项的字面意思欺骗了我们,oracle在删除主表的时候会去寻找所有以主表的主键作为外键的数据表,然后看去看从表是否有该外键的索引,如果没有则会对整个从表施加表级锁,然后对从表进行全表扫描。当然如果从表存在外键的索引,会去访问对应的索引,而不会对从表本身进行加锁。3。解决办法为从表的外键建立索引,这也是在使
6、用外键的推荐方式。这样就能避免上面出现的问题了。如果在事务中执行了一条不满足条件的update语句,则执行全表扫描,把行级锁上升为表级锁,多个这样的事务执行后,就很容易产生死锁。预备知识:DDL(DATABASEDEFINITIONLANGUAGE):数据库定义语言,如createtable、droptable.....DML(DATABASEMODIFICATIONLANGUAGE):数据库修改语言,如insert、delete、update......参考资料:Oracle8Administrator'sGuide,Release8.0Oracle8Tuning,Release8.0ORA
7、CLE锁具体分为以下几类:1.按用户与系统划分,可以分为自动锁与显示锁自动锁:当进行一项数据库操作时,缺省情况下,系统自动为此数据库操作获得所有有必要的锁。显示锁:某些情况下,需要用户显示的锁定数据库操作要用到的数据,才能使数据库操作执行得更好,显示锁是用户为数据库对象设定的。2.按锁级别划分,可分为共享锁与排它锁共享锁:共享锁使一个事务对特定数据库资源进行共享访问——另一事务也可对此资源进行访问
此文档下载收益归作者所有