加锁是为了防止一些操作而进行的比如说共享锁可以防止别的事务加上排他锁如果多个事物对同一张表都加上共享锁的话也就都不能修改了可以进行读操作如果只有一个事物加上共享锁是可以修改的
而排他锁呢则是不能增加任何共享锁和排他锁因此只要获得了排他锁就可以去进行修改不会被任何别的事物打搅到
DML 操作的是表里面的数据行;
DDL 操作的是表的元数据(表结构);隐式提交
ORACLE里锁有以下几种模式:
none
null 空
RowS 行共享(RS)共享表锁
RowX 行专用(RX)用于行的修改
Share 共享锁(S)阻止其他DML操作
S/RowX 共享行专用(SRX)阻止其他事务操作
exclusive 专用(X)独立访问使用
数字越大锁级别越高 影响的操作越多
一般的查询语句如select from ;是小于的锁 有时会在v$locked_object出现
select from for update; 是的锁
当对话使用for update子串打开一个游标时
所有返回集中的数据行都将处于行级(RowX)独占式锁定
其他对象只能查询这些数据行不能进行updatedelete或selectfor update操作
insert / update / delete ; 是的锁
没有commit之前插入同样的一条记录会没有反应
因为后一个的锁会一直等待上一个的锁 我们必须释放掉上一个才能继续工作
创建索引的时候也会产生级别的锁
locked_mode为不影响DML(insertdeleteupdateselect)操作
但DDL(alterdrop等)操作会提示ora错误
有主外键约束时 update / delete ; 可能会产生的锁
DDL语句时是的锁
以DBA角色 查看当前数据库里锁的情况可以用如下SQL语句
select object_idsession_idlocked_mode from v$locked_object;
select tusernametsidtserial#tlogon_time
from v$locked_object tv$session t
where tsession_id=tsid order by tlogon_time;
如果有长期出现的一列可能是没有释放的锁
我们可以用下面SQL语句杀掉长期没有释放非正常的锁
alter system kill session sidserial#;
如果出现了锁的问题 某个DML操作可能等待很久没有反应
当你采用的是直接连接数据库的方式
也不要用OS系统命令 $kill process_num 或者 $kill process_num来终止用户连接
因为一个用户进程可能产生一个以上的锁 杀OS进程并不能彻底清除锁的问题
记得在数据库级别用alter system kill session sidserial#;杀掉不正常的锁
select oobject_namelsession_idsserial#sprogramsusernamemand smachineslockwait
from v$locked_object l all_objects o v$session s
where oobject_id = lobject_id and ssid = lsession_id