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

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. 函数 flst_get_first

    /********************************************************************//** Gets list first node addre ...

  2. c程序设计语言_习题1-13_统计输入中单词的长度,并且根据不同长度出现的次数绘制相应的直方图

    Write a program to print a histogram of the lengths of words in its input. It is easy to draw the hi ...

  3. epub格式电子书剖析之三:NCX文件构成

    ncx文件是epub电子书的又一个核心文件,用于制作电子书的目录,其文件的命名通常为toc.ncx. ncx文件是一个XML文件,该标准由DAISY Consortium发布(参见http://www ...

  4. 正则表达式(来源http://deerchao.net/tutorials/regex/regex.htm)

    目录 跳过目录 本文目标 如何使用本教程 正则表达式到底是什么东西? 入门 测试正则表达式 元字符 字符转义 重复 字符类 分枝条件 反义 分组 后向引用 零宽断言 负向零宽断言 注释 贪婪与懒惰 处 ...

  5. getchar

    getchar函数每次只从缓冲区中接受一个字符. getchar有一个int型的返回值. 当程序调用getchar时,程序就等着用户按键,用户输入的字符被存放在键盘缓冲区中,直到用户按回车为止(回车字 ...

  6. HW4.8

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  7. HDU4349--Xiao Ming's Hope(数论)

    输入一个n(1<=n<=108),求C(n,0),C(n,1),C(n,2)...C(n,n)有多少个奇数. Lacus定理 http://blog.csdn.net/acm_cxlove ...

  8. [五]JFreeChart实践四之直线图

    重点: 1.时间序列集合作为dataset,一个时间序列为一条折线 2.时间序列可以是月:年,小时:天 3.准备好时间序列要放入时间序列集合中 4.将时间序列集合作为dataset传入ChartFac ...

  9. SSIS执行SQL任务时加入参数

    昨天开发的SSIS包中,获取ERP系统parttran表时,数据量比较大,达到255万多,因为SQL执行的关系,致使处理时效率很慢,所以就想用增量更新的方法处理该表数据.这是增量更新的SQL任务集合, ...

  10. JNI 技术与 Android 应用

    1. 什么是 JNI JNI是Java Native Interface的缩写.从Java 1.1开始,JNI标准成为java平台的一部分,它允许Java和其他语言进行交互.JNI一开始为C和C++而 ...