Oracle中的锁

一、锁查询

SELECT a.* FROM V$LOCKED_OBJECT a,DBA_OBJECTS b
where a.object_id=b.object_id
and b.object_name like '%TDW_CARTOON_ROW_D%'
and b.owner='VGOPDW'

select T2.USERNAME,t1.SID,t1.TYPE,t1.LMODE,t1.REQUEST,t1.CTIME from v$lock t1,v$session t2
where t1.sid=t2.SID
and t2.USERNAME='VGOPDW';

若数据库为双机,注意查锁时,应用gv$locked_object表:
select * from dba_objects a ,gv$locked_object b where a.object_name='TDW_MM_APP_PROTAL_VISIT_LOG_D' and b.OBJECT_ID=a.object_id

查看数据库全局实例信息:
select * from gv$instance;
查看会话信息:
select * from gv$session
where sid = '5942';

查看数据库中正在运行的sql信息:
select * from gv$sql
where sql_id = '68x3n8s1gkjdt';

二、锁概念
锁的作用:用来控制多个用户对表里相同的数据的并行访问

mysql行级锁包含记录锁、间隙锁、临键锁,参考https://zhuanlan.zhihu.com/p/52678870
锁分类
根据保护对象的不同,Oracle数据库锁可分为:

DML lock(data locks,数据锁):用于保护数据的完整性。
DDL lock(dictionary locks,字典锁):用于保护数据库对象的结构(例如表、视图、索引的结构定义)。
Internal locks 和latches(内部锁与闩):保护内部数据库结构。
Distributed locks(分布式锁):用于OPS(并行服务器)中。
PCM locks(并行高速缓存管理锁):用于OPS(并行服务器)中。

在锁定中,存在下面的两种基本模式:
1、排他锁(Exclusive简称X锁):一旦用户对某个资源添加了排他锁,则其他用户都不能再对该资源添加任何类型的锁
                                                  直到该用户释放了资源上的X锁

2、共享锁(share简称S锁):一旦用户对某个资源添加了共享锁,则其他用户都不能在该资源上添加X锁,只能添加S锁
                                             直到该用户释放了S锁为止

DML锁定机制
能够保证当某个用户正在更新表里的一行数据时,其他用户不能同时更新相同的数据行,而且也不能删除或修改被更新表的表结构
锁定分为两种级别:行级锁(TX锁( 事务锁或行级锁))和表级锁(TM锁)

通过这种方式在表级别上添加锁定的方式,我们就能够比较容易并且高效的(因为不需要扫描表里的每一条记录来判断在表上
是否有DML事务)对锁定进行管理了,表级锁共具有五种模式,如:
(1)行级排他锁(Row exclusive,简称RX锁)
当我们进行DML时,会自动在被更新的表上添加RX锁,可以执行LOCK命令显式的在表上添加RX锁,在该锁定模式下,允许其
他事务通过DML语句修改相同表里的其他数据行,允许使用lock命令对表添加RX锁定,但是,不允许其他事务对表添加排它锁
(X锁)。
(2) 行级共享锁(row shared RS锁)
通常是通过select ... from <table_name> for update语句添加的,同时该方法也是
我们用来手工锁定某些记录的主要方法,比如,当我们在查询某些记录的过程中,不希
望其他用户对这些记录进行更新,经常发出这些命令。当数据使用完毕以后,发出rollback
命令解锁。表上添加了RS锁以后,不允许其他事务对相同的表添加X锁,但是允许其他事务
通过DML语句或lock命令锁定相同表里的其他数据行。
(3) 共享锁(shared,简称S锁)
通过lock table <table_name> in share mode命令添加S锁,在该锁定模式下,不允许任何用户更新表,
但是允许其他用户发出select ... from <table_name> for update命令对表添加行级共享锁RS
共享锁和排他锁的区别是可以允许RS
(4) 排他锁(exclusive )X锁
通过lock table <table_name> in exclusive mode命令添加X锁。在该锁定模式下,其他用户不能对表进行任
何的DML和DDL操作,只能进行查询
(5) 共享行级排他锁(shared row exclusive)SRX锁
通过lock table <table_name> in share row exclusive mode命令添加SRX锁,该锁定模式比行级排他锁和共享
锁的级别都要高,这时不能对相同的表进行DML操作,也不能添加共享锁

对于通过lock table命令主动添加的锁定来说,如果要释放它们,只要发出rollback命令即可

上述几种锁模式中,RS锁是限制最少的锁,X锁是限制最多的锁。它们的兼容关系如下:


基本上所有的锁都可以由Oracle内部自动创建和释放,但是其中的DDL和DML锁是可以通过命令进行管理的,命令语法:
LOCK table_name IN 
    [row share][row exclusive][share][share row exclusive][exclusive] MODE 
[NOWAIT];

下图列出产生锁定模式的SQL语句:

当程序对所做的修改进行提交(Commit)或回滚(Rollback)后,锁住的资源便会得到释放,从而允许其他用户进行操作。

如果两个事务,分别锁定一部分数据,而都在等待对方释放锁才能完成事务操作,这种情况下就会发生死锁

DDL共享锁
用来保护被DDL的对象不被其他用户进程所更新,但是允许其他进程在对象上添加共享的DDL锁
如果是对表进行DDL命令,则其他进程可以同时修改表里的数据,比如我们发出create view
命令创建视图时,在视图的所引用的表(基表)上添加的就是共享的DDL命令,也就是说,在
创建视图时,其他用户不能修改基表的结构,但是可以更新基表中的数据
DDL排它锁
大部分的DDL操作都会在被操作的对象上添加排他的DDL锁定,从而防止在DDL命令执行期间
对象被其他用户所修改,当对象上添加了排他的DDL锁定以后,改对象不能再添加任何其他
的DDL锁定,如果是对表进行DDL命令,则其他进程不能修改表里的数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值