烟一支一支地点
酒一杯一杯的干
请你要体谅我
我酒量不好别给我挖坑
不时会遇到,不小心把表锁住的情况。再此,相对Oracle锁相关的知识做一些粗浅的总结。
当不小心锁表时:
1 查询session被锁的sql,简要查询,得到SID
select object_name,machine,s.sid,s.serial# from v$locked_object l,dba_objects o ,v$session s
where l.object_id = o.object_id and l.session_id=s.sid;
2.使用alter system kill session 'num1,num2'; (其中num1,num2分别是上面查询出的sid,serial#)进行释放
alter system kill session 'num1,num2'
3.执行下面的语句获得进程(线程)号,sid为第一步查询出的sid号:
select spid, osuser, s.program from v$session s,v$process p where s.paddr=p.addr and s.sid=num1;
4.通过进程号。通过系统Linux或者Window的相关命令,来解决锁
Oracle相关的锁分类(根据保护对象不同):
1.DML锁:用户保护数据的完整性,delete,update,insert
2.DDL锁:用于保护数据库对象的结构,如表,索引等的结构定义
3.内部锁:保护数据的内部结构
单纯按照锁来分,分为表级锁(TM),行级锁(TX)。粗浅理解,就是当做创建索引,对整个表结构产生影响时,会使用到表级锁。当影响,只是某些行时,用到行级别锁。比如,插入,修改,删除某些行。
读永远不会阻止写,除了select * from dual for update.写永远不会阻塞读。当一行被修改后,oracle通过回滚,提供数据的一致性读。我的理解,当oracle在做写操作时,数据已经写入到表中。但还未提交事务时,读操作,会读取,数据库,在提交事务前的数据。这里的机制,我理解为oracle的回滚