Oracle死锁定位及排查解决方案

数据库的锁技术,是很多人头痛的部分,因为概念实在是抽象,如果没有一个深入浅出的道理去理解,光靠看各种搜索出来的文章,会各种云里雾里,下面我从个人的一些经验出发,和大家一起聊一聊锁。锁:锁在SQL语句开始它们与数据的相互作用时获得,并在事务的整个过程中有效。一个简单的理解:你要进家门,关门,进门拿东西等,必须先要获得开锁权和关锁权,否则没有办法完成你要做的事。至于事务:你首先要具备...
摘要由CSDN通过智能技术生成

数据库的锁技术,是很多人头痛的部分,因为概念实在是抽象,如果没有一个深入浅出的道理去理解,光靠看各种搜索出来的文章,会各种云里雾里,下面我从个人的一些经验出发,和大家一起聊一聊锁。

 

锁:锁在SQL语句开始它们与数据的相互作用时获得,并在事务的整个过程中有效。

一个简单的理解:你要进家门,关门,进门拿东西等,必须先要获得开锁权和关锁权,否则没有办法完成你要做的事。

至于事务:你首先要具备的知识点(如果你还不了解事务,那么谈锁和后面的内容将各种看不透)。

常见类型:

独占模式(排他):不允许其他任何并发会话以任何方式共享锁定的资源,修改数据时需要这种锁。(房间钥匙只有一把,我拿到进了门,其他人不能再进入且尝试修改数据)。

共享模式:允许对同一块数据的并发读访问。在更改数据时,上升为独占模式。(教室的窗户开着,任何人可以趴在窗户上听教室内老师的上课(读操作),但是想让老师帮你检查作业或去和教室内的学生讲话,就办不到)。

 

1、行级锁

insert update delete #隐式加行锁(排他)

update emp set ename='Joke' where empno=7499;

在锁释放之前,其他用户不可以对锁定的数据行进行(修改,删除)操作,查询可以

select ... for update #显示加行锁(共享)

select * from emp where deptno=30 forupdate

select ...for update #用于显示锁定将要更新的数据行,防止其他用户在更新之前操作此行。

假如有其他用户要锁定同一资源:可以使用wait 子句对锁的等待时间控制

如: 在另一用户中:select * from emp where deptno=30 for update wait 2 (等待2秒)

如2秒钟还未释放资源,系统将会给出提示信息。

 

2、表级锁

锁定表的通用语法:

lock table 表名 in<share or share update or exclusive mode>;

   1)共享模式(in share mode)

不允许其他用户插入,更新和删除行。多个用户可以同时在同一表上设置共享锁,这样设置锁的多个用户都只能执行查询。

例:lock table emp in share mode;

    2) 共享更新模式(in share update mode)

允许多个用户同时锁定表的不同行, 允许其他用户进行DML(insertupdate delete)操作 , 除了已锁定的行。

例:lock table emp in share update mode;

select * from emp where deptno=30 for update //锁定的行

其他用户不能delete ,update 部门30的雇员信息

其他用户可以查看锁定的行: select * from empwhere deptno=30

    3)排他锁模式(限制性强)

不允许其他用户插入,更新和删除行, 允许查看数据,但只有一个用户可以在表中放置排他锁。

例:lock table emp in exclusive mode;

 

3、死锁

简单的说,进程A等待进程B释放他的资源,B又等待A释放他的资源,这样就互相等待就形成死锁。

比方说:

1:User1 修改tab1

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值