--查询锁 select t.SID, t.SERIAL#, t2.OBJECT_TYPE, t.USERNAME ORACLE_USER, t2.OBJECT_NAME, t.OSUSER, t.MACHINE, t3.SQL_TEXT from v$session t, v$locked_object t1, dba_objects t2, v$sql t3 where t.SID = t1.SESSION_ID AND t1.OBJECT_ID = t2.OBJECT_ID AND t3.SQL_ID = t.SQL_ID; --解锁(sid:2038 serial#:52937) alter system kill session '2038,52937';
有趣的一些视图:v$lock、v$locked_object、v$session、v$dba_objects、v$sql
DML、DDL和DCL含义: DML(Data Manipulation Language,数据操作语言):用于检索或者修改数据。 DML包括: SELECT INSERT UPDATE DELETE DDL(Data Definition Language,数据定义语言): 用于定义数据的结构,比如 创建、修改或者删除数据库对象。 DDL包括:DDL语句可以用于创建用户和重建数据库对象。下面是DDL命令: CREATE TABLE ALTER TABLE DROP TABLE CREATE INDEX DROP INDEX DCL(Data Control Language,数据控制语言):用于定义数据库用户的权限。 DCL包括: ALTER PASSWORD GRANT REVOKE CREATE SYNONYM
1、Oracle数据库的锁类型
根据保护的对象不同,Oracle数据库锁可以分为以下几大类:DML锁(data locks,数据锁),用于保护数据的完整性;DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;内部锁和闩(internal locks and latches),保护数据库的内部结构。
1)DML锁:目的在于保证并发情况下的数据完整性。在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。
当Oracle 执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位。这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。TM锁包括了SS、SX、S、X 等多种模式,在数据库中用0-6来表示。不同的SQL操作产生不同类型的TM锁。
4个常见的dml语句会产生阻塞:INSERT、UPDATE、DELETE、SELECT…FOR UPDATE。(Insert发生阻塞的唯一情况就是用户拥有一个建有主键约束的表。当2个的会话同时试图向表中插入相同的数据时,其中的一个会话将被阻塞,直到另外一个会话提交或会滚。一个会话提交时,另一个会话将收到主键重复的错误。回滚时,被阻塞的会话将继续执行;UPDATE 、DELETE当执行操作的数据行已经被另外的会话锁定时,将会发生阻塞,直到另一个会话提交或会滚;Select …for update
当一个用户发出select..for update的错作准备对返回的结果集进行修改时,如果结果集已经被另一个会话锁定,就是发生阻塞。需要等另一个会话结束之后才可继续执行。可以通过发出 select… for update nowait的语句来避免发生阻塞,如果资源已经被另一个会话锁定,则会返回以下错误:Ora-00054:resource busy and acquire with nowait specified.)
2、悲观锁和乐观锁
(1)悲观锁
锁在用户修改之前就发挥作用:Select ..for update(nowait)、Select * from tab1 for update。
用户发出这条命令之后,oracle将会对返回集中的数据建立行级封锁,以防止其他用户的修改。
如果此时其他用户对上面返回结果集的数据进行dml或ddl操作都会返回一个错误信息或发生阻塞。
1):对返回结果集进行update或delete操作会发生阻塞。
2):对该表进行ddl操作将会报:Ora-00054:resource busy and acquire with nowait specified.
原因分析:
此时Oracle已经对返回的结果集上加了排它的行级锁,所有其他对这些数据进行的修改或删除操作都必须等待这个锁的
释放,产生的外在现象就是其他的操作将发生阻塞,这个这个操作commit或rollback.同样这个查询的事务将会对该表加表级
锁,不允许对该表的任何ddl操作,否则将会报出ora-00054错误::resource busy and acquire with nowait specified.
(2)乐观锁
乐观的认为数据在select出来到update进取并提交的这段时间数据不会被更改。这里面有一种潜在的危险就是由于被选出的结果集并没有被锁定,是存在一种可能被其他用户更改的可能。因此Oracle仍然建议是用悲观封锁,因为这样会更安全。
阻塞
定义:
当一个会话保持另一个会话正在请求的资源上的锁定时,就会发生阻塞。被阻塞的会话将一直挂起,直到持有锁的会话放弃锁定的资源为止。