通过实验来理解行级锁的发生

1.创建需要的表

SQL> conn / as sysdba
已连接。
SQL> create table dept as select * from scott.dept;

表已创建。

SQL> create table emp as select * from scott.emp;

表已创建。

SQL> alter table dept add constraint dept_pk primary key(deptno);

表已更改。

SQL> alter table emp add constraint emp_pk primary key(empno);

表已更改。

SQL> alter table emp add constraint emp_fk_dept foreign key(deptno) references dept(deptno);

表已更改。

SQL> create index emp_deptno_idx on emp(deptno);

索引已创建。

2.执行更新操作

SQL> update dept set dname=initcap(dname);

已更新4行。

3.查看此时的系统状态

SQL> set linesize 200 pagesize 1000
SQL> select username,
2 v$lock.sid,
3 trunc(id1/power(2,16)) rbs,
4 bitand(id1,to_number('ffff','xxxx'))+0 slot,
5 id2 seq,
6 lmode,
7 request
8 from v$lock,v$session
9 where v$lock.type='TX'
10 and v$lock.sid=v$session.sid
11 and v$session.username=USER;

         USERNAME      SID    RBS     SLOT    SEQ     LMODE  REQUEST
------------------------------ ---------- ---------- ---------- ---------- ---------- ----------
            SYS     68      3      23     898      6      0

通过列表可以看出lmode=6是排它锁,request=0代表没有锁请求,就是说更新了表的数据没有另一个会话更新同一条数据,就没有锁请求

SQL> select XIDUSN,XIDSLOT,XIDSQN from v$transaction;查出来的信息是事务ID可以和查询出的锁信息相对应。

XIDUSN     XIDSLOT  XIDSQN
---------- ---------- ----------
3                        23         898

4.在一个新的会话中登录相同的用户,执行更新操作

SQL> update emp set ename=upper(ename);

已更新14行。

SQL> update dept set deptno=deptno-10;

5.查看系统信息

SQL> select username,
2 v$lock.sid,
3 trunc(id1/power(2,16)) rbs,
4 bitand(id1,to_number('ffff','xxxx'))+0 slot,
5 id2 seq,
6 lmode,
7 request
8 from v$lock,v$session
9 where v$lock.type='TX'
10 and v$lock.sid=v$session.sid
11 and v$session.username=USER;

USERNAME SID RBS SLOT SEQ LMODE REQUEST
------------------------------ ---------- ---------- ---------- ---------- ---------- ----------
SYS 130 3 23 898 0 6
SYS 68 3 23 898 6 0 
SYS 130 5 33 872 6 0

SQL> select XIDUSN,XIDSLOT,XIDSQN from v$transaction;

XIDUSN XIDSLOT XIDSQN
---------- ---------- ----------
3 23 898---第一次
5 33 872---第二次

在事务信息中多了一条,在锁的信息中多了两条,其中一条请求为排他锁6,他的rbs/slot/seq与第一次的相同,说明给他加锁的就是第一次的更新操作,他在请求这个锁,来获得资源,在第二个会话中第一条语句由于也没有提交所以他也出现了排它锁。

通过锁的自联结就可以更清楚的看出他们之间谁锁了谁
SQL> select
2 (select username from v$session where sid=a.sid) blocker,
3 a.sid,
4 'is blocking',
5 (select username from v$session where sid=b.sid) blockee,
6 b.sid
7 from v$lock a,v$lock b
8 where a.block=1
9 and b.request >0
10 and a.id1=b.id1
11 and a.id2=b.id2;

BLOCKER SID 'ISBLOCKING BLOCKEE SID
------------------------------ ---------- ----------- ------------------------------ ----------
SYS 68 is blocking SYS 130

6.提交事务,查询锁信息

SQL> commit;

提交完成。

SQL> select username,
2 v$lock.sid,
3 trunc(id1/power(2,16)) rbs,
4 bitand(id1,to_number('ffff','xxxx'))+0 slot,
5 id2 seq,
6 lmode,
7 request
8 from v$lock,v$session
9 where v$lock.type='TX'
10 and v$lock.sid=v$session.sid
11 and v$session.username=USER;

USERNAME SID RBS SLOT SEQ LMODE REQUEST
------------------------------ ---------- ---------- ---------- ---------- ---------- ----------
SYS 130 5 33 872 6 0

SQL> select XIDUSN,XIDSLOT,XIDSQN from v$transaction;

XIDUSN XIDSLOT XIDSQN
---------- ---------- ----------
5 33 872

SID为68的锁不见了,130的锁只剩下了一个,有锁请求的信息也消失了,这就解释了oracle的锁机制,首先oracle的行锁不会使用锁队列管理,在第二个会话中有两个更新操作没有提交,如果是队列管理应该会有两个锁信息,现在只有一个,那在第一个会话没有提交的时侯出现两个锁信息,是因为第一个会话更新的时候对行加了排它锁,第二个会话想更新相同的行,就要向会话一发出锁请求,所以在锁信息里才有它的出现,但是它的出现,他的模式是0这样就可以理解了。

相关 脚本总结

查询锁得相关信息

查询当前会话的操作的锁状态

select username,
v$lock.sid,
trunc(id1/power(2,16)) rbs,
bitand(id1,to_number('ffff','xxxx'))+0 slot,
id2 seq,
lmode,
request
from v$lock,v$session
where v$lock.type='TX'
and v$lock.sid=v$session.sid
and v$session.username=USER;

在事务视图中找到相应的对照信息

select XIDUSN,XIDSLOT,XIDSQN from v$transaction;

查看锁的自联结信息,可以查看谁把谁锁定了

select
(select username from v$session where sid=a.sid) blocker,
a.sid,
'is blocking',
(select username from v$session where sid=b.sid) blockee,
b.sid
from v$lock a,v$lock b
where a.block=1
and b.request >0
and a.id1=b.id1
and a.id2=b.id2;

oracle学习----行级锁的理解的更多相关文章

  1. Mysql事务及行级锁的理解

    在最近的开发中,碰到一个需求签到,每个用户每天只能签到一次,那么怎么去判断某个用户当天是否签到呢?因为当属表设计的时候,每个用户签到一次,即向表中插入一条记录,根据记录的数量和时间来判断用户当天是否签 ...

  2. MySQL学习笔记(五):MySQL表级锁和行级锁

    一:概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking ...

  3. 行级锁 java||数据库

    http://www.cnblogs.com/xiyubaby/p/4623516.html select * from t for update 会等待行锁释放之后,返回查询结果. select * ...

  4. 转 MySQL中的行级锁,表级锁,页级锁

      对mysql乐观锁.悲观锁.共享锁.排它锁.行锁.表锁概念的理解 转载. https://blog.csdn.net/puhaiyang/article/details/72284702 实验环境 ...

  5. Mysql的事务及行级锁

    转自:http://www.cnblogs.com/edwinchen/p/4171866.html 以签到为例,每个用户每天只能签到一次,那么怎么去判断某个用户当天是否签到呢?因为当初表设计的时候, ...

  6. Oracle学习笔记七 锁

    锁的概念 锁是数据库用来控制共享资源并发访问的机制. 锁用于保护正在被修改的数据 直到提交或回滚了事务之后,其他用户才可以更新数据 对数据的并发控制,保证一致性.完整性.

  7. [数据库事务与锁]详解五: MySQL中的行级锁,表级锁,页级锁

    注明: 本文转载自http://www.hollischuang.com/archives/914 在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的 ...

  8. MySQL行级锁,表级锁,页级锁详解

    页级:引擎 BDB. 表级:引擎 MyISAM , 理解为锁住整个表,可以同时读,写不行 行级:引擎 INNODB , 单独的一行记录加锁 表级,直接锁定整张表,在你锁定期间,其它进程无法对该表进行写 ...

  9. InnoDB这种行锁实现特点意味者:只有通过索引条件检索数据,InnoDB才会使用行级锁,否则,InnoDB将使用表锁!

    InnoDB行锁是通过索引上的索引项来实现的,这一点MySQL与Oracle不同,后者是通过在数据中对相应数据行加锁来实现的. InnoDB这种行锁实现特点意味者:只有通过索引条件检索数据,InnoD ...

随机推荐

  1. linux PCI设备初始化过程

    linux PCI设备初始化过程 start_kernel->rest_init 这个函数会启动一个核心线程0, 核心线程然后调用init -> do_basic_setup. 然后我们开 ...

  2. openwrt开发

    之前写过一篇日志,是关于如何搭建自己的OpenWRT开发环境.经过最近一段时间的开发学习和实践,对OpenWRT环境的开发有了一定的了解.在这里将我的开发心得做个整理. 1.搭建开发环境 首先,我们需 ...

  3. bzoj2565

    网络流就先告一段落了 在进行其他训练之前,我决定先练一道后缀数组(对这个我还是比较有自信的) 虽然之前没用后缀数组解决过回文问题,但是稍微想想就知道, 要解决最长双倍回文,首先要解决最长回文序列, 要 ...

  4. poj1988

    知道了并查集写的问题后,我也明白了为什么之前这道题TLE的原因: 有这道题的合并操作不难想到用并查集维护: 由于并查集易于向上查询而不易于向下查询 所以对于询问方块x下面有多少个方块,我们可以转化为立 ...

  5. Linux Kernel 本地内存损坏漏洞

    漏洞名称: Linux Kernel 本地内存损坏漏洞 CNNVD编号: CNNVD-201310-663 发布时间: 2013-11-05 更新时间: 2013-11-05 危害等级:    漏洞类 ...

  6. Java问题汇集(1)

    1.javax.el.PropertyNotFoundException: Property 'Price' not found on type pet.petshop.dto.WareDto 简答: ...

  7. Linux中ifreq 结构体分析和使用

    结构原型: struct ifreq{#define IFHWADDRLEN 6 union {  char ifrn_name[IFNAMSIZ];   } ifr_ifrn;  union {   ...

  8. M-矩阵

    实方阵 $A$ 称为 $M$-矩阵, 是指 $A=cI-B$, $B\geq 0$, $c\geq \rho(B)$. 这里, $M$ 据说是暗指 Minkowski.

  9. HDU5654xiaoxin and his watermelon candy 离线+树状数组

    题意:bc 77div1 d题(中文题面),其实就是询问一个区间有多少不同的三元组,当然这个三元组要符合条件 分析(先奉上官方题解) 首先将数列中所有满足条件的三元组处理出来,数量不会超过 nn个. ...

  10. 安装solr

    安装之前先关闭防火墙.安装好jdk和tomcat 1.启动tomcat的命令为:apache-tomcat-7.0.61/bin/startup.sh 2.拷贝solr目录下example/webap ...