oracle学习----行级锁的理解
通过实验来理解行级锁的发生
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学习----行级锁的理解的更多相关文章
- Mysql事务及行级锁的理解
在最近的开发中,碰到一个需求签到,每个用户每天只能签到一次,那么怎么去判断某个用户当天是否签到呢?因为当属表设计的时候,每个用户签到一次,即向表中插入一条记录,根据记录的数量和时间来判断用户当天是否签 ...
- MySQL学习笔记(五):MySQL表级锁和行级锁
一:概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking ...
- 行级锁 java||数据库
http://www.cnblogs.com/xiyubaby/p/4623516.html select * from t for update 会等待行锁释放之后,返回查询结果. select * ...
- 转 MySQL中的行级锁,表级锁,页级锁
对mysql乐观锁.悲观锁.共享锁.排它锁.行锁.表锁概念的理解 转载. https://blog.csdn.net/puhaiyang/article/details/72284702 实验环境 ...
- Mysql的事务及行级锁
转自:http://www.cnblogs.com/edwinchen/p/4171866.html 以签到为例,每个用户每天只能签到一次,那么怎么去判断某个用户当天是否签到呢?因为当初表设计的时候, ...
- Oracle学习笔记七 锁
锁的概念 锁是数据库用来控制共享资源并发访问的机制. 锁用于保护正在被修改的数据 直到提交或回滚了事务之后,其他用户才可以更新数据 对数据的并发控制,保证一致性.完整性.
- [数据库事务与锁]详解五: MySQL中的行级锁,表级锁,页级锁
注明: 本文转载自http://www.hollischuang.com/archives/914 在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的 ...
- MySQL行级锁,表级锁,页级锁详解
页级:引擎 BDB. 表级:引擎 MyISAM , 理解为锁住整个表,可以同时读,写不行 行级:引擎 INNODB , 单独的一行记录加锁 表级,直接锁定整张表,在你锁定期间,其它进程无法对该表进行写 ...
- InnoDB这种行锁实现特点意味者:只有通过索引条件检索数据,InnoDB才会使用行级锁,否则,InnoDB将使用表锁!
InnoDB行锁是通过索引上的索引项来实现的,这一点MySQL与Oracle不同,后者是通过在数据中对相应数据行加锁来实现的. InnoDB这种行锁实现特点意味者:只有通过索引条件检索数据,InnoD ...
随机推荐
- ruby的命名约定
1 局部变量和方法参数以小写字母开头 2 方法名字以小写字母开头 3 全局变量以$开头 4 实例变量以@开头 5 类变量以@@开头 6 常量以大写字母开头 7 类和模块名以大写字母开头
- WIP Job > APP-WIP-25191 or Pending Close
使用 Close Discrete Jobs (FORM) 关闭工单,有一工单的状态一直为PENDING CLOSE 检查 PENDING MATERIAL TRANSACTION ,PENDING ...
- 下拉列表联动显示(Car表) 三级联动
.Models namespace 下拉列表联动显示_Car表_.Models { public class ProductorBF { private MyDBDataContext _contex ...
- Linux kernel ‘lbs_debugfs_write’函数数字错误漏洞
漏洞名称: Linux kernel ‘lbs_debugfs_write’函数数字错误漏洞 CNNVD编号: CNNVD-201311-421 发布时间: 2013-11-29 更新时间: 2013 ...
- apache开源项目--hadoop
Hadoop 是一个分布式系统基础架构,由Apache基金会开发.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力高速运算和存储.Hadoop实现了一个分布式文件系统(Had ...
- jquery插件cloud-zoom(放大镜)
效果预览:http://www.helloweba.com/demo/cloud-zoom/ 源代码下载:http://pan.baidu.com/s/1eQnadXo Cloud Zoom是一个图像 ...
- sharepoint 2010 隐藏左边菜单left menu样式脚本
转:http://www.cfanz.cn/?c=article&a=read&id=60536 在v4.master中,<head></head>标签中,加入 ...
- GIS数据格式:Geodatabase
转自:http://www.cnblogs.com/quansixiang/archive/2010/09/17/1829286.html 1 Geodatabase概念 Geodatabase是A ...
- C#调用C++函数入口点的问题 z
C++使用 void extern __declspec(dllexport) 函数名()定义的输出函数, 在C#中调用时, 如前文所述, 使用 [DllImport("D:\VS2005P ...
- POJ 1511 Invitation Cards dij
分析:正向加边,反向加边,然后两遍dij #include<cstdio> #include<cstring> #include<queue> #include&l ...