锁的种类,阻塞,死锁产生与解决办法。

TM锁的种类:

TM锁几种模式的互斥关系:

阻塞

定义:
当一个会话保持另一个会话正在请求的资源上的锁定时,就会发生阻塞。被阻塞的会话将一直挂起,直到持有锁的会话放弃锁定的资源为止。4个常见的dml语句会产生阻塞
INSERT
UPDATE
DELETE
SELECT…FOR UPDATE

——————————————————————————————————————————————————————————————

update 的阻塞     试验:

1.    获得会话sid

SQL> select sid from v$mystat where rownum=1;    (首先update的会话sid)

SID
----------
1

SQL> select sid from v$mystat where rownum=1;     (随后update的会话sid)

SID
----------
39

2.   操作表

SQL> select * from andy;     (查看操作表)

ID
----------
1

SQL> update andy set id=2 where id=1;     (首先,会话sid为1的update)

1 row updated.

SQL> update andy set id=2 where id=1;      (随后,会话sid为39的update,执行后,发现被阻塞)

3.   查看会话锁冲突

SQL> select sid,type,lmode,id1,id2,request,block from v$lock where type in(‘TM‘,‘TX‘) order by 1,2;

SID         TY  LMODE       ID1         ID2         REQUEST BLOCK
---------- --  ---------- ---------- ---------- ---------- ----------
1             TM       3       79729         0             0             0
1             TX       6       131072       1276        0             1
39           TM       3       79729         0             0             0
39           TX       0       131072       1276        6             0

解释说明:

SID:表示会话sid。

TY:表示锁的类型。

ID1:在TM一行中表示的是被修改表的标识(object_id)。如: 1             TX       6       131072       1276        0             1

ID1:在TX一行中表示以十进制数值表示该事务所占用的回滚段号与该事务在该回滚段的事务表(Transaction table)中所占用的槽号(slot number,可理解为记录号)。其组成形式为: 0xRRRRSS 如:  1             TX       6       131072       1276        0             1

REQUEST:0表示的是已经获得锁。非0表示被阻塞,请求获得锁。 如:sid为1的会话,先update andy set id=2 where id=1;获得该行的TX锁,但为提交。然后sid为39的会话,再次andy set id=2 where id=1;请求获得该行的TX锁,但是该行TX锁被sid为1的会话占用,所以未获得该说,被阻塞,只能等待(sid为1提交与自己回滚)。

BLOCK:表示该锁是否阻塞了其他锁。 数字几代表阻塞了几

--  验证 TM一行中表示的是被修改表的标识(object_id)。(确实如此)

SQL> select object_name from dba_objects where object_id=79729;

OBJECT_NAME
--------------------------------------------------------------------------------
ANDY

至此,阻塞试验完毕。

查询会话之间锁等待的关系

select a.sid holdsid,b.sid waitsid,a.type ,a.id1,a.id2,a.ctime from v$lock a,v$lock b
where a.id1=b.id1 and a.id2=b.id2 and a.block = 1 and b.block = 0 ;

HOLDSID WAITSID TY ID1 ID2 CTIME
---------- ---------- -- ---------- ---------- ----------
1 39 TX 458777 1066 503
1 51 TX 458777 1066 503

查被阻塞的会话
select * from v$lock where lmode=0 and type in (‘TM‘,‘TX‘);

——————————————————————————————————————————————————————————

死锁-deadlock

定义:当两个用户希望持有对方的资源时就会发生死锁.
即两个用户互相等待对方释放资源时,oracle认定为产生了死锁,在这种情况下,将以牺牲一个用户作为代价,另一个用户继续执行,牺牲的用户的事务将回滚.
例子:
1:用户1对A表进行Update,没有提交。
2:用户2对B表进行Update,没有提交。
此时双反不存在资源共享的问题。
3:如果用户2此时对A表作update,则会发生阻塞,需要等到用户一的事物结束。
4:如果此时用户1又对B表作update,则产生死锁。此时Oracle会选择其中一个用户进行会滚,使另一个用户继续执行操作。
起因:
Oracle的死锁问题实际上很少见,如果发生,基本上都是不正确的程序设计造成的,经过调整后,基本上都会避免死锁的发生。

死锁试验:

SQL> select * from andy;

ID
----------
3
2

SQL> delete andy where id=2;    (会话1)

1 row deleted.

SQL> delete andy where id=3;     (会话2)

1 row deleted.

SQL> delete andy where id=3;      (会话1)
delete andy where id=3
*
ERROR at line 1:
ORA-00060: deadlock detected while waiting for resource

SQL> delete andy where id=2;       (会话2,阻塞状态)

死锁产生后,处理办法:

1)执行下面SQL,先查看哪些表被锁住了:
>select b.owner,b.object_name,a.session_id,a.locked_mode
from v$locked_object a,dba_objects b
where b.object_id = a.object_id;

2)查看引起死锁的会话
>select b.username,b.sid,b.serial#,logon_time
18:09:40 2 from v$locked_object a,v$session b
18:09:40 3 where a.session_id = b.sid order by b.logon_time;

3)查看被阻塞的会话
>select * from dba_waiters;

4)可以提交或回滚阻塞的话,释放锁或者杀掉ORACLE进程:
ALTER SYSTEM KILL SESSION ‘SID,SERIAL#‘;
说明:
如果杀掉所有死锁相关的会话,则所有会话的事务回滚,相当于事务都为未执行。
如果杀掉报ORA-00060: deadlock detected while waiting for resource的会话,阻塞会话commit,阻塞会话将完成该会话的所有事务。
如果杀掉被阻塞的会话,报ORA-00060会话commit,则完成的事务是未产生死锁之前的事务。
如果报ORA-00060: deadlock detected while waiting for resource的会话进行rollback,阻塞会话commit,阻塞会话将完成该会话所有事务。

ok,结束。 转载请标明出处。

时间: 2024-08-04 22:22:41

锁的种类,阻塞,死锁产生与解决办法。的相关文章

数据库锁表及阻塞的原因和解决办法

问题说明 当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性.加锁是实现数据库并发控制的一个非常重要的技术.在实际应用中经常会遇到的与锁 相关的异常情况,当两个事务需要一组有冲突的锁,而不能将事务继续下去的话,就会出现死锁,严重影响应用的正常执行. 在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁).当数据对象被加上排它锁时,其他

java锁的种类以及辨析(转载)

java锁的种类以及辨析(一):自旋锁 锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) .这些已经写好提供的锁为我们开发提供了便利,但是锁的具体性质以及类型却很少被提及.本系列文章将分析JAVA下常见的锁名称以及特性,为大家答疑解惑. 1.自旋锁 自旋锁是采用让当前线程不停地的在循环体内执行实现的,当循环的条件被其他线程改变时 才能进入临界区.如下 01 public class SpinLock { 02  

数据库事务 - 怎样才能产生 互相等待 - 死锁,怎么解决

数据库事务 - 怎样才能产生 互相等待 - 死锁,如何解决 1. 最简单的死锁 最常见的死锁 是因为一个事务执行时间过长,而导致另外一个事务 无法 访问 被被该事务锁定的资源,最终 超时 而导致的死锁异常.  这种情况无非有两种解决方案,一是性能调优. 二是当该事务遇到等待超时导致的死锁异常后,继续让该事务 re-try. 2. 互相等待 -- 死锁     这种 死锁的异常情况特殊,两个极短的事务 在 高并发的环境下也可能发生 相互等待 -- 死鎖 的情況. a) 怎样导致的? 总的来说,是因

30分钟全面解析-SQL事务+隔离级别+阻塞+死锁

以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化. 本系列[T-SQL基础]主要是针对T-SQL基础的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础]04.表表达式-上篇 [T-SQL基础]04.表表达式-下篇 [T-SQL基础]05.集合运算 [T-SQL基础]06.透视.逆透视.分组集 [T-SQL基础]07.数据修改 [T-SQL基础]08.事务和并发 [

mysql数据库死锁的产生原因及解决办法

这篇文章主要介绍了mysql数据库锁的产生原因及解决办法,需要的朋友可以参考下 数据库和操作系统一样,是一个多用户使用的共享资源.当多个用户并发地存取数据 时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性.加锁是实现数据库并 发控制的一个非常重要的技术.在实际应用中经常会遇到的与锁相关的异常情况,当两个事务需要一组有冲突的锁,而不能将事务继续下去的话,就会出现死锁,严 重影响应用的正常执行. 在数据库中有两种基本的锁类型

Oracle死锁产生的原因和解决办法

如果有两个会话,每个会话都持有另一个会话想要的资源,此时就会发生死锁.用下面实验来说明死锁的产生原因和解决办法.SESSION1:SQL> create table t2 as select * from emp;SQL> select * from t2 where empno=7369; EMPNO ENAME      JOB              MGR HIREDATE                 SAL       COMM     DEPTNO---------- ---

Python36 1.joinablequeue 2.线程理论 3.多线程对比多进程 4.线程的使用方式 4.1.产生 线程的两种方式 4.2.守护线程 4.3.线程安全问题 4.3.1.互斥锁 4.3.2.死锁 4.3.3.可重入锁 4.3.4.信号量

复习1.守护进程2.互斥锁(解决数据错乱的方法)3.IPC(进程间通讯)4.生产者与消费者模型 详解:1.守护进程 一个进程可以设为另一个进程的守护进程 特点:被守护的进程结束时,守护进程也会随之结束 本质:父进程交给子进程一个任务,然而父进程 先于子进程结束了,子进程的任务也就没有必要 继续执行了 格式:开始前加 p.daemon=True 2.互斥锁(解决数据错乱的方法)方法一:互斥锁 互斥 互相排斥 锁的本质:一个标志 标志的两个状态: 1.锁定 2.未锁定 什么时候用? 当多个进程要操作

MySQL redo lock 死锁问题排查 & 解决过程

版权声明:本文由 MySQL redo lock 死锁问题排查 & 解决过程 张青林 原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/181 来源:腾云阁 https://www.qcloud.com/community 周一上班,首先向同事了解了一下上周的测试情况,被告知在多实例场景下 MySQL Server hang 住,无法测试下去,原生版本不存在这个问题,而新版本上出现了这个问题,不禁心头一颤,心中不禁感到奇怪

SQL Server锁分区特性引发死锁解析

原文:SQL Server锁分区特性引发死锁解析 锁分区技术使得SQL Server可以更好地应对并发情形,但也有可能带来负面影响,这里通过实例为大家介绍,分析由于锁分区造成的死锁情形. 前段时间园友@JentleWang在我的博客锁分区提升并发,以及锁等待实例中问及锁分区的一些特性造成死锁的问题,这类死锁并不常见,我们在这里仔细分析下.不了解锁分区技术的朋友请先看下我的锁分区那篇实例. Code(执行测试脚本时请注意执行顺序,说明) 步骤1 创建测试数据 use tempdb go creat