`
jishuaige
  • 浏览: 10307 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

关于死锁

 
阅读更多
最近在项目中遇到了死锁的问题,在解决死锁的同时,也比较系统的理解了相关的锁,这里记录一下。
了解一下innodb中的锁
基本锁:
共享锁(S锁):读锁:事务T对数据A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。

排他锁(X锁):写锁。事务T对数据A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的X锁之前不能再读取和修改A。

注意:如果2个JOB同时获取到了数据A(就是同时给数据A加上了S锁),因为jobA给数据A添加S锁后,jobB也可以对数据A添加S锁。那么当2个JOB都需要开始对数据A进行修改时,那么都要同时升级到X锁,在这种情况下就会出现死锁(jobA等待jobB释放S锁,jobB等待jobA释放S锁)。

锁与索引的关系
主键本身就是索引。innodb对于主键使用了聚簇索引,这是一种数据存储方式,表数据是和主键一起存储。主键索引的叶结点存储行数据。普通索引,其叶结点存储的是主键值(普通索引锁住了,也会锁住相对应的的主键左右)。

分析下索引和锁的关系
id:主键      token:二级索引(非唯一)
1)update table_1 set msg='a' where id=1;
由于id是主键,所以锁定table_1表中的此行记录。(X锁)

2)update table_1 set msg='a' where token='b';
由于token是二级索引,会先锁定这个二级索引(表中的记录token的值为b的行,有几行锁定几行),然后锁定相应主键所对应的记录。(X锁)

3)update table_1 set msg='a' where msg='b';
没有索引,是全表扫描,会对表中的各个记录加上X锁。

以上的是在数据库事务隔离级别是RC(已提交读)级别下的锁。

数据库事务隔离级别:1)未提交读(Read uncommitted);2)已提交读(Read committed(RC));3)可重复读(Repeatable read(RR));4)可串行化(Serializable)
提交读(RC):只能读取到已经提交的数据。
可重复读(RR):在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。

在RC的级别下的锁,可以防止不同事务数据修改提交时造成数据冲突的情况。但是在做insert的时候会出现幻读。



innodb在RR隔离级别中引入了GAP锁,可以避免幻读发生。
在事务A执行update语句的时候,innodb首先会和RC级别一样,给索引上的记录添加上X锁,此外,还在非唯一索引token值与相邻两个索引的区间加上锁。这样在事务B执行insert语句,然后commit;时会首先检查这个区间是否被锁上,如果被锁上,则不能立即执行,需要等待该gap锁被释放。这样就能避免幻读问题。

造成死锁的原因:
1)不同表相同记录行锁冲突



2)相同表记录行锁冲突:2个job做更新操作


3)不同索引锁冲突:事务A在执行时,除了了在二级索引加锁,还会在主键上加锁。事务B只会在主键上加锁。


4)GAP锁冲突



  • 大小: 8.5 KB
  • 大小: 7 KB
  • 大小: 7.6 KB
  • 大小: 3.4 KB
  • 大小: 7 KB
分享到:
评论

相关推荐

    oracle中关于死锁的处理

    ### Oracle中关于死锁的处理 #### 死锁概述 在Oracle数据库中,死锁是一种常见但必须妥善处理的问题。当两个或多个事务互相等待对方释放资源时就会发生死锁。这种情况下,没有一个事务能够继续执行,直到系统采取...

    银行家算法 关于死锁

    《银行家算法与死锁预防——深入理解操作系统中的并发控制》 在计算机系统中,操作系统是管理和调度硬件资源的关键软件,而并发控制是其核心功能之一。死锁,作为并发控制中的一个严重问题,一旦发生,会导致多个...

    oracle死锁原因解决办法

    除了alert.log外,Oracle还会为每个死锁生成一个跟踪文件(trace file),该文件包含了更多关于死锁的信息。在上述示例中提到的跟踪文件路径为 `e:\oracle\admin\GEDEON\udump\ORA01784.TRC`。跟踪文件中包含的详细...

    通过SQL Server Profiler来监视分析死锁

    同时,可以设置数据列,例如“TextData”和“DeadlockGraph”,它们提供了关于死锁的详细信息。 4. **开始跟踪**: 设置好参数后,点击“运行”开始跟踪。当发生死锁时,Profiler会记录相关信息。 5. **分析死锁...

    java 一个死锁的例子

    "Java.jpg"文件可能是一个关于死锁的流程图或者示意图,帮助直观理解死锁的发生过程。 总之,理解并避免Java中的死锁对于编写高效、可靠的多线程应用程序至关重要。开发者应具备良好的并发编程知识,以便在设计和...

    操作系统课程设计-死锁检测

    "www.pudn.com.txt"可能是一份资料链接或说明文档,提供了更多关于死锁检测的参考资料。 通过这个课程设计,学生不仅能够学习到死锁的基本理论,还能通过实际操作加深理解,提升解决问题的能力。这将对他们在未来...

    死锁的定义

    这意味着,尽管死锁已经广泛被认识和研究,但关于死锁的精确定义以及如何区分不同的死锁状态,以及如何为每一种状态找到合适的处理方法,这些都是需要进一步研究和澄清的问题。这表明在死锁的研究中还存在不一致性,...

    计算机操作系统课件:第4章进程同步与通信-死锁03.ppt

    关于死锁的一些结论是:参与死锁的进程最少是两个,参与死锁的进程至少有两个已经占有资源,参与死锁的所有进程都在等待资源,参与死锁的进程是当前系统中所有进程的子集。 产生死锁的原因有两个:竞争系统资源和...

    3.3.2 进程死锁1

    以下是关于死锁的一些关键知识点: 1. **死锁定义**:死锁是指两个或更多进程相互等待对方持有的资源而无法继续执行的状态。这种情况通常发生在多任务操作系统中,当资源分配不当或进程间的同步机制出现问题时发生...

    对于死锁的处理

    ### 死锁处理详解 #### 引言 ...本文详细介绍了关于死锁的处理方法及其背后的理论基础。通过对死锁的深入了解和预防算法的应用,可以有效地避免多任务系统中出现的死锁问题,进而提高系统的可靠性和效率。

    现代操作系统第章死锁完整版资料.ppt

    以下是关于死锁的详细讲解: **1. 资源** 资源是操作系统管理的核心元素,包括硬件资源(如打印机、磁带驱动器)和软件资源(如内存、系统表项)。资源可以分为两类:可抢占和不可抢占。可抢占资源是指可以被强制从...

    死锁的检测和预防实验报告

    本实验报告主要探讨了操作系统中关于死锁的检测和预防问题,通过使用C++编程语言实现银行家算法,以模拟进程资源分配的过程,从而避免死锁的发生。实验旨在帮助学生深入理解并发执行的进程以及死锁的概念,并通过...

    MySQL死锁1

    此外,数据库的日志也可以提供关于死锁发生的线索。 为了预防死锁,有几点建议可以遵循: 1. 设计事务时,应尽量使它们保持短暂,这样减少持有锁的时间,从而降低死锁的风险。 2. 提交事务的速度要快,避免长时间...

    sishu.rar_ 死锁_操作系统_操作系统 算法_操作系统 课程设计_课程设计

    总的来说,这个课程设计涵盖了操作系统中关于死锁的理论知识和实践技能,通过编写和执行死锁检测算法,学生将能够更好地掌握并发控制、资源管理以及系统稳定性等相关概念。这是一个既有挑战性又富有成效的学习过程,...

    进程线程及死锁

    进程、线程、死锁和POSIX规范的系统调用 进程是操作系统中一个独立的执行单元,它拥有自己的虚拟地址空间和系统资源。线程是轻量级的进程,它共享同一个进程的虚拟地址空间和系统资源。理解进程和线程的概念对于...

    linux 死锁概念

    进一步解释了linux系统中关于死锁的知识点,让大家更容易理解

    SQL Server死锁的解除方法

    "SQL Server死锁的解除方法" SQL Server死锁是指在多个事务之间的资源竞争时,出现的循环等待资源的现象。死锁会导致系统性能下降,甚至会导致系统崩溃。因此,解决SQL Server死锁是非常重要的。 SQL Server死锁的...

    操作系统-死锁

    从进程同步的概念可以知道,当并发进程需要竞争使用资源或需要相互协作向前推进时,如果不采取同步措施,或同步措施不恰当,则很容易导致并发进程不能向前推进而陷入僵局,即死锁现象。死锁是发生在一组相互竞争或...

    sqlserver如何快速查询死锁语句

    在SQL Server数据库管理系统中,死锁是一个常见的性能问题,它发生在两个或多个事务相互等待对方释放资源,导致它们都无法继续执行。死锁不仅影响数据库的正常运行,还可能导致数据一致性问题。本文将详细介绍如何在...

Global site tag (gtag.js) - Google Analytics