前言

数据库事务是oracle非常基础又极为重要的概念。之前已经介绍过相关的一些概念,相关文章见下:

oracle产生事务transaction几种方式或方法
oracle事务隔离级别transaction isolation level初识

产生数据库事务时,必然会在数据库事务运行期间产生各种各样的锁。与锁相关的动态性能视图为v$lock,里面有个列lmode,即持锁模式或叫锁模式,其具体含义及取值

锁模式lmode可以有7种不同的取值,每个值到底是什么意思,具体含义见下

锁模式测试实践

创建测试表并插入记录

SQL>createtablet_lockmode(aint,bint);Tablecreated.SQL>insertintot_lockmodeselect1,1fromdual;1rowcreated.SQL>commit;Commitcomplete.row share

这种锁模式允许多个会话并发访问被锁定的表,但是不允许其它会话以exclusive排它模式锁定整个表这种锁模式也是锁模式shareupdate的同义词这种锁模式仍然存在是为了兼容oracle旧版本--未加锁前的测试会话的持锁信息(可见数据库一直会持有各种锁,下述的锁是系统锁,而非用户锁)SQL>selectaddr,sid,type,lmode,request,blockfromv$lockwheresid=73;ADDRSIDTYLMODEREQUESTBLOCK----------------------------------------------------------000000008D2498B873AE400000000008D249AE873TO300--测试会话加rowshare锁模式SQL>locktablet_lockmodeinrowsharemode;Table(s)Locked.--加锁模式rowshare后的持锁信息SQL>/ADDRSIDTYLMODEREQUESTBLOCK----------------------------------------------------------000000008D2498B873AE400000000008D249AE873TO30000007FE54C209CD873TM200--lmode=2---其它会话可以rowshare锁模式并发访问表SQL>selectsidfromv$mystatwhererownum=1;SID----------28SQL>locktablet_lockmodeinrowsharemode;Table(s)Locked.SQL>rollback;Rollbackcomplete.--其它会话可以rowexclusive锁模式并发访问表SQL>locktablet_lockmodeinrowexclusivemode;Table(s)Locked.SQL>rollback;Rollbackcomplete.---其它会话可以share锁模式并发访问表SQL>locktablet_lockmodeinsharemode;Table(s)Locked.SQL>rollback;Rollbackcomplete.----其它会话可以sharerowexclusive锁模式并发访问表SQL>locktablet_lockmodeinsharerowexclusivemode;Table(s)Locked.SQL>rollback;Rollbackcomplete.----其它会话不能以exclusive锁模式并发访问表--卡住SQL>locktablet_lockmodeinexclusivemode;SQL>/ADDRSIDTYLMODEREQUESTBLOCK----------------------------------------------------------000000008D2498B873AE400000000008D249AE873TO30000007FE54C2042E073TM201row exclusive

这种锁模式同于rowshare,但是不允许其它会话以share锁模式访问这种锁模式在执行DML操作(update,insert,delete)会自动获取这种锁模式测试会话以rowexclusive锁模式持有表SQL>locktablet_lockmodeinrowexclusivemode;Table(s)Locked.SQL>selectaddr,sid,type,lmode,request,blockfromv$lockwheresid=73;ADDRSIDTYLMODEREQUESTBLOCK----------------------------------------------------------000000008D2498B873AE400000000008D249AE873TO30000007FE54C2042E073TM300--lmode=3--其它会话可以rowshare锁模式并发访问表SQL>locktablet_lockmodeinrowsharemode;Table(s)Locked.SQL>rollback;Rollbackcomplete.--其它会话可以rowexclusive锁模式并发访问表SQL>locktablet_lockmodeinrowexclusivemode;Table(s)Locked.SQL>rollback;Rollbackcomplete.--其它会话不能以share锁模式并发访问表--卡住SQL>locktablet_lockmodeinsharemode;^Clocktablet_lockmodeinsharemode*ERRORatline1:ORA-01013:userrequestedcancelofcurrentoperation--其它会话不能以sharerowexclusive锁模式并发访问表SQL>locktablet_lockmodeinsharerowexclusivemode;^Clocktablet_lockmodeinsharerowexclusivemode*ERRORatline1:ORA-01013:userrequestedcancelofcurrentoperation--其它会话不能以exclusive锁模式并发访问表SQL>locktablet_lockmodeinexclusivemode;^Clocktablet_lockmodeinexclusivemode*ERRORatline1:ORA-01013:userrequestedcancelofcurrentoperationshare

这种锁模式允许多个会话并发查询,但是不允许对于锁定表的update操作测试会话以share锁模式持有表SQL>locktablet_lockmodeinsharemode;Table(s)Locked.SQL>selectaddr,sid,type,lmode,request,blockfromv$lockwheresid=73;ADDRSIDTYLMODEREQUESTBLOCK----------------------------------------------------------000000008D2498B873AE400000000008D249AE873TO30000007FE54C209CD873TM400--lmode=4--其它会话可以rowshare锁模式并发访问表SQL>locktablet_lockmodeinrowsharemode;Table(s)Locked.SQL>rollback;Rollbackcomplete.--其它会话不能以rowexclusive锁模式并发访问表SQL>locktablet_lockmodeinrowexclusivemode;^Clocktablet_lockmodeinrowexclusivemode*ERRORatline1:ORA-01013:userrequestedcancelofcurrentoperation--其它会话可以share锁模式并发访问表SQL>locktablet_lockmodeinsharemode;Table(s)Locked.SQL>rollback;Rollbackcomplete.---其它会话不允许以sharerowexclusive锁模式并发访问表SQL>locktablet_lockmodeinsharerowexclusivemode;^Clocktablet_lockmodeinsharerowexclusivemode*ERRORatline1:ORA-01013:userrequestedcancelofcurrentoperation---其它会话不允许以exclusive锁模式并发访问表SQL>locktablet_lockmodeinexclusivemode;^Clocktablet_lockmodeinexclusivemode*ERRORatline1:ORA-01013:userrequestedcancelofcurrentoperationshare row exclusive

这种锁模式用于查看整个表,允许其它会话查看表的数据,但是不允许其它会话以share锁模式获取表,也不允许其它会话update被锁定表这种锁模式允许对于锁定表的查询,但不允许对于锁定表的其它任何操作测试会话以sharerowexclusive锁模式持有表SQL>locktablet_lockmodeinsharerowexclusivemode;Table(s)Locked.SQL>/ADDRSIDTYLMODEREQUESTBLOCK----------------------------------------------------------000000008D2498B873AE400000000008D249AE873TO30000007FE54C209CD873TM500--其它会话允许以rowshare锁模式并发访问表SQL>locktablet_lockmodeinrowsharemode;Table(s)Locked.SQL>rollback;Rollbackcomplete.--其它会话不允许以rowexclusive锁模式并发访问表SQL>locktablet_lockmodeinrowexclusivemode;^Clocktablet_lockmodeinrowexclusivemode*ERRORatline1:ORA-01013:userrequestedcancelofcurrentoperation---其它会话不允许以share锁模式并发访问表SQL>locktablet_lockmodeinsharemode;^Clocktablet_lockmodeinsharemode*ERRORatline1:ORA-01013:userrequestedcancelofcurrentoperation---其它会话不允许以sharerowexclusive锁模式并发访问表SQL>locktablet_lockmodeinsharerowexclusivemode;^Clocktablet_lockmodeinsharerowexclusivemode*ERRORatline1:ORA-01013:userrequestedcancelofcurrentoperation---其它会话不允许以exclusive锁模式并发访问表SQL>locktablet_lockmodeinexclusivemode;^Clocktablet_lockmodeinexclusivemode*ERRORatline1:ORA-01013:userrequestedcancelofcurrentoperationexclusive

这种锁模式允许对于锁定表的查询,但不允许对于锁定表的其它任何操作--测试会话以exclusive锁模式持有表SQL>locktablet_lockmodeinexclusivemode;Table(s)Locked.SQL>/ADDRSIDTYLMODEREQUESTBLOCK----------------------------------------------------------000000008D2498B873AE400000000008D249AE873TO30000007FE54C2042E073TM600--lmode=6--其它会话不允许以rowshare锁模式并发访问表SQL>locktablet_lockmodeinrowsharemode;^Clocktablet_lockmodeinrowsharemode*ERRORatline1:ORA-01013:userrequestedcancelofcurrentoperation---其它会话不允许以rowexclusive锁模式并发访问表SQL>locktablet_lockmodeinrowexclusivemode;^Clocktablet_lockmodeinrowexclusivemode*ERRORatline1:ORA-01013:userrequestedcancelofcurrentoperation---其它会话不允许以share锁模式并发访问表SQL>locktablet_lockmodeinsharemode;^Clocktablet_lockmodeinsharemode*ERRORatline1:ORA-01013:userrequestedcancelofcurrentoperation---其它会话不允许以sharerowexclusive锁模式并发访问表SQL>locktablet_lockmodeinsharerowexclusivemode;^Clocktablet_lockmodeinsharerowexclusivemode*ERRORatline1:ORA-01013:userrequestedcancelofcurrentoperation--其它会话不允许以exclusive锁模式并发访问表SQL>locktablet_lockmodeinexclusivemode;^Clocktablet_lockmodeinexclusivemode*ERRORatline1:ORA-01013:userrequestedcancelofcurrentoperation锁模式之间的的兼容性图

小结

exclusive锁模式最牛逼,它是唯我独尊,独对排它访问,它一占用表锁资源,其它会话只能等待

row share(share update)锁模式相对而言最温和,它基本和所有的锁模式可以并存,只是不允许exclusive锁模式

share row exclusive锁模式虽然没有exclusive锁模式这么牛逼,它可以排第二种严厉锁模式,它只能兼容row share(share update)锁模式

row exclusive及share锁模式排位在share row exclusive之后,它可以兼容3种锁模式,不兼容余下2种锁模式

培训课件

(收费20元)

联系方式