Oracle锁机制lock
数据库当中的锁分为两种类型:
DDL锁:是保护数据结构的,保护对象的完整性,也叫字典锁;
DML锁,在事务中产生的,为了保证并发数据同时修改时不要使数据被破坏,行级锁
DDL锁:
例如给表加字段,首先要锁住表的结构,再去增加新的列;
--Scott用户下的表都处于没被锁定状态 SCOTT@oracle11g>select table_name,table_lock from user_tables ; TABLE_NAME TABLE_LO ------------------------------ -------- SALGRADE ENABLED BONUS ENABLED EMP ENABLED DEPT ENABLED --新建表 SCOTT@oracle11g>create table u1 as select * from emp; Table created. SCOTT@oracle11g>select table_name,table_lock from user_tables ; TABLE_NAME TABLE_LO ------------------------------ -------- U1 ENABLED SALGRADE ENABLED BONUS ENABLED EMP ENABLED DEPT ENABLED SCOTT@oracle11g>alter table u1 disable table lock; Table altered. --给u1表加锁 SCOTT@oracle11g>select table_name,table_lock from user_tables ; TABLE_NAME TABLE_LO ------------------------------ -------- U1 DISABLED SALGRADE ENABLED BONUS ENABLED EMP ENABLED DEPT ENABLED --验证查看,被锁住的表禁止一切DDL操作 SCOTT@oracle11g>truncate table u1; truncate table u1 * ERROR at line 1: ORA-00069: cannot acquire lock -- table locks disabled for U1 SCOTT@oracle11g>drop table u1 purge; drop table u1 purge * ERROR at line 1: ORA-00069: cannot acquire lock -- table locks disabled for U1
DML锁:
--查看当前会话SID SCOTT@oracle11g>select sid from v$mystat where rownum <2; SID ---------- 144 --插入数据没有提交,去sys查该sid锁的情况,新增了TM、TX锁,直到事务结束才能解锁 SYS@oracle11g>set linesize 150 SYS@oracle11g>select * from v$lock where sid =144; ADDR KADDR SID TY ID1 ID2 LMODE REQUEST ---------------- ---------------- ---------- -- ---------- ---------- ---------- ---------- 0000000081D8FD70 0000000081D8FDC8 144 AE 100 0 4 0 0000000081D90AA8 0000000081D90B00 144 TO 79833 1 3 0 00007F9C52E072E8 00007F9C52E07348 144 TM 89397 0 3 0 00000000813908C8 0000000081390940 144 TX 524316 1507 6 0
死锁查看锁的队列信息,调用脚本:SYS@oracle11g>@?/rdbms/admin/utllockt.sql
死锁报错信息:
ERROR at line 1:
ORA-00060: deadlock detected while waiting for resource
--block字段是1,说明该会话阻断了其他回话入队 SYS@oracle11g>select * from v$lock where sid ='144'; ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK ---------------- ---------------- ---------- -- ---------- ---------- ---------- ---------- ---------- ---------- 0000000081D8FD70 0000000081D8FDC8 144 AE 100 0 4 0 5761 0 0000000081D90AA8 0000000081D90B00 144 TO 79833 1 3 0 5034 0 00007F9C52E145B8 00007F9C52E14618 144 TM 89397 0 3 0 791 0 00000000813908C8 0000000081390940 144 TX 262145 1289 6 0 791 1 --判断该数据无问题可杀掉会话 SYS@oracle11g>select sid,serial# from v$session where sid='144'; SID SERIAL# ---------- ---------- 144 7 SYS@oracle11g>alter system kill session '144,7' immediate; System altered. --连接已丢失 SCOTT@oracle11g>/ select * from u1 * ERROR at line 1: ORA-03135: connection lost contact Process ID: 3262 Session ID: 144 Serial number: 7
勇敢坚韧真正之才智乃刚毅之志向
posted on 2018-10-27 23:06 Memory_Python 阅读(576) 评论(0) 收藏 举报
浙公网安备 33010602011771号