Oracle中的锁
锁是一种机制,多个事务同时访问一个数据库对象时,该机制可以实现对并发的控制
按照用户系统锁可以分为自动锁和显示锁。
自动锁(系统上锁):DML锁、DDL锁、systemlocks锁
显示锁:用户为数据库对象设定的锁
按照锁的级别可以分为。
排他锁(exclusive lock, X锁):事务设置排他锁后,事务单独获得资源,在此事务提交之前,其他事务不能获取同一资源
和共享锁(share lock,S锁):多个事务可以同时访问同一资源,可以为事务提供高并发性,容易造成死锁和数据更新丢失。
按照操作分为。
1.DML锁(data locks,数据锁):用于控制事务并发中的数据操作,保护数据完整性。
2.DDL锁:DDL是保护表结构定义的。
DML锁又可分为
TM锁(表级锁)
TX锁(事务锁或行级锁)
TM锁
SQL语句:
select * from v$lock where lmode>=0 and type in ('TM','TX');可以查看锁
锁的模式表示如下:
sql例句:
手工锁表:
lock table trwtcTest1 in row share mode nowait; --1
lock table trwtcTest1 in share update mode nowait; --2
lock table trwtcTest1 in row exclusive mode nowait; --3
lock table trwtcTest1 in share mode nowait; --4
lock table trwtcTest1 in share row exclusive mode nowait; --5
lock table trwtcTest1 in exclusive mode nowait; --6
手工解锁:
rollback/commit
DDL锁:DDL是系统自动加锁,从而保护这些对象不会被其他会话所修改。
例如,我执行一个DDL操作ALTERTABLE T,表T上就会加一个排他DDL锁,以防止其他会话得到这个表的DDL锁和TM锁。在DDL语句执行期间会一直持有DDL锁,一旦操作执行就立即释放DDL锁。
有3种类型的DDL锁:
1.排他DDL锁(Exclusive DDL lock):这会防止其他会话得到它们自己的DDL锁或TM(DML)锁。这说明,在DDL操作期间你可以查询一个表,但是无法以任何方式修改这个表。
2.共享DDL锁(Share DDL lock):这些锁会保护所引用对象的结构,使之不会被其他会话修改,但是允许修改数据。
3.可中断解析锁(Breakable parse locks):这些锁允许一个对象(如共享池中缓存的一个查询计划)向另外某个对象注册其依赖性。
锁的粒度
行级锁(TX),表级锁(TM), 数据库级锁:
锁的工作性质:
只有被修改时,行才会被锁定。
当一条语句修改了一条记录,只有这条记录上被锁定,在Oracle数据库中不存在锁升级。
当某行被修改时,它将阻塞别人对它的修改。
当一个事务修改一行时,将在这个行上加上行锁(TX),用于阻止其它事务对相同行的修改。
读永远不会阻止写。
读不会阻塞写,但有唯一的一个例外,就是select ...for update。
写永远不会阻塞读。
当一行被修改后,Oracle通过回滚段提供给数据的一致性读