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)    收藏  举报

导航