今天看到ZALBB和jeffli73讨论的文章《oracle多粒度封锁机制研究》,觉得比喻的很有意思,不过jeffli73在坛子上只是比喻了单粒度的封锁机制,没继续比喻多粒度的封锁,这里,我狗尾续貂,按照jeffli73的意思也打个比方吧。
一个艺术中心占地很广(我们把它类比做数据库),有许多独立的建筑-艺术馆(艺术馆相当于数据库中的“表”),各个艺术馆中又有许多展馆(相当于表中的记录),为了使各个艺术馆得到有效的管理,对进出艺术馆的人员进行了分类并对他们各自的行为做了如下限制:
1 2 3 4 5 |
A:一般观众:,在任何情况下,他们可以自由进出艺术馆的各个展馆,没有限制,但他们只能观看;给通票。 B:不同工种的维修工人:他们可以进入展馆进行检查或维修,但是在某一时刻,只能有一个工种的工人在某个展馆进行维修(这主要是为了安全,比如油漆工与电焊工如果同时作业,可能会引起火灾);在这里,我们把做检查的工人配RS的胸卡,把做维修的工人配RX的胸卡。 C:贵宾(比如联合国世界文化遗产的评审官员):为了保证这些贵宾的参观效果,在他们参观期间,不允许任何的维修、展馆调整(下面介绍)等工作,但仍然可以进行检查和接待一般观众;同时,后来的贵宾可以进入艺术馆和先来的贵宾一起参观。贵宾配S的胸卡。 D:维修后的清洁人员:维修人员(RX)在维修后会产生垃圾需要清理,这些维修后的垃圾有清洁人员清理,他们在工作期间,不允许进行维修工作和调整工作,但是可以进行检查工作,同时为了维护艺术馆形象,工作期间贵宾不能进入,但是一般观众可以进入参观。为了节省费用,一个清洁工人负责整片场地的清洁,下一个的到来必须等这个清洁完毕再入内。清洁人员配SRX的胸卡。 E:展馆调整人员:由于展馆调整会涉及多个展馆,所以在调整期间,不允许对任何展馆进行维修,也不接待任何贵宾;展馆调整人员配X的胸卡。 |
到时我会守在艺术馆的门口,对于:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
1. 手持通票的人,我将一律放行; 2. 对于来检查的维修人员,即佩戴RS胸卡的人: 2.1 我先检查一下手里是否有RS的胸卡,看看该RS胸卡和现在要进入的人是否去同一个展馆,如果是去同一展馆就说明也有人在里面进行检查,因此需要等待,如果不是就放行,且记下他去的展馆号码。记下展馆号码后的胸卡我留下,等维修人员出来后还给他。 2.2 如果我手中有的是RX的胸卡,则看看是否和检查人员要去的是同一个的展馆,如果是说明有人在同一展馆内进行维修,需要等待前者出来后再进去,如果不是,就放行。 2.3 如果我手中有的是S胸卡,说明有贵宾在参观,但是不影响检查,则放行。 2.4 如果我手中是SRX的胸卡,说明有清洁人员在打扫,但是不影响检查工作,则放行。 2.5 如果我手中拿的是X的胸卡,说明在进行展馆调整,不允许进行检查,则等待。 3. 对于来维修的人员,即佩戴RX胸卡的人: 3.1 我先检查一下手里是否有RS的胸卡,看看该RS胸卡和现在要进入的人是否去同一个展馆,如果是则说明现在还有人在同一展馆做检查,维修人员不能进去,则等待;如果不是同一展馆的,这放行,且记下他去的展馆号码。 3.2 如果我手里的是RX的胸卡,且胸卡上的展馆号和现在来的人员要去的是同一个展馆,则需要等前者完成工作出来后才能进去,因此需要等待;如果不是同一展馆的,则放行,且记下去的展馆号码。 3.3 如果我手里的是S胸卡,说明里面有贵宾在参观,不能进行维修,则等待。 3.4 如果我手里的是SRX胸卡,说明里面有清洁人员在打扫,也不能维修,则等待。 3.5 如果我的手里是X的胸卡,说明在进行展馆调整,不能维修,则等着 4. 对于来参观的贵宾,即佩戴S胸卡的人: 4.1 我先检查一下手里是否有RS胸卡,如果有,说明里面正在检查,这要分2种情况了: 4.1.1 对于指定房间的检查(即select where for update),由于参观不确定会去哪个展馆,为避免不小心看到了正在搞检查工作的展馆,还是等检查工作完毕在进去,此时S胸卡的人在外面等待。 4.1.2 对于不指定展馆的检查(即lock table in row share mode),则能进去参观。 4.2 如果我手里有RX的胸卡,说明里面正在进行维修,不能进去参观,贵宾需等待维修完成再进去。 4.3 如果我手里是S的胸卡,说明之前已经有一位贵宾进去,根据之前的条件,此刻的这个贵宾也能一起进去参观,于是放行。 4.4 如果我手里的是SRX的胸卡,说明正在清理,为保持形象,贵宾需等待。 4.5 如果我手里是X胸卡,说明正在调整展馆,不能进去参观,贵宾等待。 5. 对于来进行清理的人员,即佩戴SRX胸卡的人: 5.1 我先检查是否有RS的胸卡,如果有,说明正在进行检查,但是检查工作和清扫工作不冲突,于是放行。 5.2 如果我手里有RX的胸卡,说明还在维修,维修和维修的垃圾清扫冲突,则等待 5.3 如果我手里有S的胸卡,说明有贵宾在参观,此时为了保持形象,不能进行清扫工作,则等待。 5.4 如果我手里有的是SRX胸卡,说明已经有一个清洁人员进去,根据约定,不能2个清洁人员一起进场,于是等待。 5.5 如果我手里是X胸卡,说明正在调整展馆,不能进去参观,需要等待。 6. 对于来展馆调整人员,即佩戴X胸卡的人: 6.1 我查一下手中是否有卡,有卡说明有检查维护工作、清洁工作或者贵宾正在里面,此时展馆不能调整,则等待。 6.2 如果手里没有卡,此时可以调整,则放行。 |
题外话:从10G R2开始select for update已经改成了RX的模式,即lmode为3,这应该说是一个改进,因为从之前的文档上看,select for update是RS锁,可以兼容S锁,前提条件是*Yes, if no conflicting row locks are held by another transaction. Otherwise, waits occur.但是在实际的测试中,如果我select * from table where 1=2 for udpate,这样的不锁任何数据的RS锁,也会让lock table in share mode阻塞。因此,现实的情况select for update为RX锁的情况吻合了,所以10G R2这个版本被改成RX锁,算是修正了。