oracle数据库中锁定的标准级别保证了最大可能的并发级别。也就是说,如果某个会话正在更新一行,那么只有这行会被锁定。此外锁定这一行只是为了防止其他会话对其进行更新,其他会话可以随时执行读取操作。只有在使用commit或rollback命令结束事务之后,锁定才会被解除。这种锁定是一个“排他exclusive锁”:在指定行上请求排它锁的第一个会话会获得这个锁定,其他请求对该记录进行写访问的会话必须等该。虽然这一行已通过锁定会话进行了更新,但是对其进行读访问是被允许的,并且这些读操作会设计撤销数据的使用,从而确保读会话并不会看到任何未被提交的更改。
对于一行或一个完整表上的排他锁来说,每次只能有一个会话可以获得这个排它锁,不过许多会话可以同时获得同意对象上的“共享shared”锁。在一行上设置共享锁毫无意义,其原因是在于锁定一行的唯一目的是不允许其他会话更改它。共享锁被置于整个表上,同时许多会话可以过得同一个表上的共享锁。在一个表上放置共享锁的目的是为了放置另一个会话获得这个表上的排他锁(在已经存在共享锁的情况下无法再过得排他锁)。在表上放置排他锁时需要执行DDL语句。如果其他会话已经在一个表上放置了共享锁,那么我们就无法执行修改某个对象的语句(例如删除这个表的某一列)。
为了在行上执行DML语句,当前会话必须获得待更改行上的排他锁以及包含这些行的表上的共享锁。如果另一个会话已经获得了待更改行上的排他锁,那么当前会话就会被挂起,直至使用commit或rollback命令解除了这些锁定。如果另一个会话已经获取了表上的共享锁以及其他行上的排他锁,就不存在任何的问题。一个表上的排他锁也是允许的,但是除非DDL语句要求这么做,默认锁定机制是不锁定整个表的。
所有DML语句至少都需要两种锁:受影响的记录上的排他锁,以及包含受影响记录的表上的共享锁。排他锁能够防止其他会话干扰指定的行,而共享锁则能够防止其他会话使用DDL语句修改表的定义。这两种锁定会被自动请求。如果某条DML语句在指定记录上无法获得所需的排他锁,那么会挂起这条语句直至获得所需的排他锁。
执行DDL命令需要使用所设计的对象上的排它锁。只有在针对指定表的所有DML事务结束,且行上的排他锁以及表上的共享锁都被解除了之后,我们才可以获得执行DDL命令所需的排他锁。任何DDL语句所需的排他锁都是被自动请求的。但是,如果无法获得所需的排他锁(通常是因为其他会话已经获得用于DML语句的共享锁),那么DDL语句会由于错误立即终止。
修改t中id=6的记录,但是不做commit操作:
HR@orcl 23-OCT-14>select * from t;
ID
----------
1
1
1
3
4
2
5
6
8 rows selected.
HR@orcl 23-OCT-14>update t set id=7 where id=6;
1 row updated.
ID
----------
1
1
1
3
4
2
5
6
8 rows selected.
HR@orcl 23-OCT-14>update t set id=7 where id=6;
1 row updated.
在当前会话中可以看到记录已经更新了。
打开另一个会话,查看t的记录:
@ 23-OCT-14>conn hr/hr
Connected.
HR@orcl 23-OCT-14>select * from t;
ID
----------
1
1
1
3
4
2
5
6
8 rows selected.
Connected.
HR@orcl 23-OCT-14>select * from t;
ID
----------
1
1
1
3
4
2
5
6
8 rows selected.
查看到的记录是没有更新的,因为事务还未被提交,所以其他会话查询到的是撤销段中的数据记录。
打开另一个会话对同一行记录进行更新操作:
HR@orcl 23-OCT-14>update t set id=8 where id=6;
会发现,该语句会处于挂起的状态,这是因为该行记录已经被排他锁锁定了,所以其他会话要对其进行排他锁锁定的话,只能等第一个获得该行排他锁的会话执行commit或rollback操作完成事务了。
在第一个会话中执行commit完成事务:
再去看看第二个会话:
会看到“0 rows updated”的情况,这是由于第一个更新操作已经将id为6的记录修改为id=7了,所以第二个会话进行的更新操作找不到对应的id=6的记录了。
再去看看第三个会话,此时是可以看到被修改的记录的:
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29800581/viewspace-1308751/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29800581/viewspace-1308751/