1.概念
管理对共享资源的并发访问。
2.更新丢失问题的解决方法
(1)悲观锁。认为数据一开始存在被修改的嫌疑,一开始就锁住行数据,直至自己完成操作后释放锁。
举个列子可以对悲观锁更好的理解,USERA 用户锁住一行数据,中途离开等原因,其他用户无法更新该行数据。
照成长时间的等待,这是悲观锁的缺点。而乐观锁只会更新数据时瞬间的锁定,瞬间的释放。
悲观锁经典例子: select * from t where rn = 1 for update ;
(2)乐观锁。认为数据不会更改,直至自己要更新数据的时候才锁住行数据。想到乐观锁就会联想到ORA-01555,
的确快照过旧是乐观锁的真实的写照,当一表更新较频繁,有一事物运行时间较长的情况,就会出现以上的情况
3.阻塞
如果一个会话持有某个资源的锁,而另一个会话在请求这个资源,就会出现阻塞,数据库中有5条常见的DML语句可能
会阻塞,具体是: INSERT 、UPDATE 、 DELETE 、 MERGE 和 SELECT FOR UPDATE 。
4.死锁
如果你有两个会话,每个会话都持有另一个会话想要的资源,此时就会出现死锁。
5.锁的分类
ORACLE的锁主要有以下3大类:
DML锁
DDL锁
DML锁分了:
表级锁 TM(表对象上) TM,这里摘取了Table dMl中大写的字母。
是表级维护锁,防止DDL语句,修改了多少个对象,就能得到多少个 TM 锁 。
行级锁 TX(行对象上) TX,这里摘取了Transactin eXclusive中大写的字母。
行级排它锁,每个事务只能得到一个 TX 锁。
查询锁的相关视图:v$ transaction,V$lock,v$session
DDL锁分了:
排他 DDL 锁:这会防止其他会话得到它们自己的 DDL 锁或 TM ( DML )
锁。这说明,在 DDL 操作期间你可以查询一个表,但是无法以任何方式修改这个表。
共享 DDL 锁:这些锁会保护所引用对象的结构,使之不会被其他会话修改,但
是允许修改数据。
可中断解析锁:这些锁允许一个对象(如共享池中缓存的一个查询计划)
向另外某个对象注册其依赖性。如果在被依赖的对象上执行 DDL , Oracle 会查看已经对该对象注册了依
赖性的对象列表,并使这些对象无效。因此,这些锁是“可中断的”,。
6.查锁以及杀锁
(1)查锁
SELECT p.spid, a.serial#, c.object_name, b.session_id, b.oracle_username,
b.os_user_name
FROM v$process p, v$session a, v$locked_object b, all_objects c
WHERE p.addr = a.paddr AND a.process = b.process
AND c.object_id = b.object_id
(2)杀锁
alter system kill session 'sid,serial#';