一、锁类型
1、 DDL锁:ORACLE自动发布和释放。
2、 DML锁:ROLLBACK语句时,事务也结束。
3、 内部锁:
二、锁模式
1、 RS(ROW SHARE)为了更新,某个事务在表中锁定了行,但是允许其他事务锁定表中的其他行。
2、 RX(ROW EXCLUSIVE)为了更新,某个事务在表中锁定了行,但是不允许其他事务锁住这个表。
3、 S(SHARE)某个事务以一个模式锁定了表,这个模式允许其他事务以SHARE模式锁定这个表,但不允许在这个表中进行任何更新
4、 SRX(SSX)(SHARE ROW EXCLUSIVE/SHARE-SUBEXCLUSIVE)在SHARE MODE中,不允许其他事务锁定这个表,并且不允许DML语句
5、 TM 表级别的锁
6、 TX 行级别的锁
7、 UUL用户定义的锁
8、 XX(EXCLUSIVE)这个表被锁定了,而且不允许其他会话锁定这个表,或者把DML语句提交到这个表。
三、锁级别
1、 数据库级别
Alter system enable restricted session;
Startup mount;
Alter database open read only;
2、 表级别
Lock table table_name in lock_mode mode;
3、 行级别
4、 列级别:ORACLE不支持
四、SET TRANSACTION
1、 SERIALIZABLE 确保这个模式的事务总是看到原来的数据库
2、 READ COMMITTED 一个事务只看到已经被某个其他事务提交了数据库的修改
Set transaction isolation level serializable;
五、检测与解决锁争用
select * from v$lock; select * from dba_blockers; 阻塞其它用户会话的ID。select * from dba_waiters; 等待被阻塞会话释放的锁的会话ID。
select * from v$locked_object;
查询一个用户是否被另一个用户阻塞
select 'blocker('||bw.holding_session||':'||sb.username||') - sql:'||bq.sql_text BLOCKERS, 'waiter ('||bw.waiting_session||':'||sw.username||') - sql:'||sq.sql_text WAITERS from dba_waiters bw,v$session sb,v$session sw,v$sqlarea bq,v$sqlarea sqwhere bw.holding_session=sb.sid and bw.waiting_session=sw.sid and sb.PREV_SQL_ADDR=bq.ADDRESS and sw.sql_address=sq.ADDRESS and bw.mode_held<>'None';
@/ora/prod/proddb/9.2.0/rdbms/admin/utllockt.sql
Dbms_lock
Alter system kill session;
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/10756358/viewspace-246171/ ,如需转载,请注明出处,否则将追究法律责任。