【MySQL】资源分类,锁的分类、死锁的产生原因、避免和解决方法

什么是资源:

     系统中有很多资源,在采用互斥性访问并且不可被抢占的资源就叫 临界性资源。

对于资源的分类:

1.根据使用次数分类:

(1)可重用性资源: 每一个可重用性资源中的单元都只能被一个进程所使用,不允许多个进程共享。

          进程使用资源顺序:a:请求资源(如果请求失败,则会进程堵塞或者循环等待),b:使用资源,c:释放资源

        系统中的可重复性资源的数量都是固定不变的,程序运行时不会增加或减少。

(2)消耗性资源:  是临时资源,当有进程运行时来动态创建和消耗的,每一类消耗性资源的数目都是不断变化的,通常是指在生产者进程中创建,在消费者进程中消耗。

2.根据是否可抢占分类:

  (1)可抢占性:  CPU,主存等共享性资源

  (2)不可抢占性: 打印机、光驱等不可共享性资源

 

锁的分类:

锁对象用于管理对共享资源的并发访问——Innodb存储引擎实现了一下两种类型的锁。

  (1)排他锁(写锁-X lock):

     用于数据的修改操作,例如i  INSERT,UPDATE,DELETE.确保同一个资源不会多重更新。可以防止并发事务对资源进行访问。其它事务不能读取或修改排它 (X) 锁锁定的数据。

     事务T 对数据A加上排他锁,那么其他事务则不能对数据A加其他任何锁。获准排他锁的事务可以对数据A进行 读和写操作。其他事务不行。

  (2)共享锁(读锁-S lock):

      共享锁是 允许不更新或者不改变数据的只读操作,比如SELECT语句

      事务T 对数据A加上共享锁、那么其他事务只能对数据A再加共享锁,不能加排他锁。获准共享锁的事务只可以对数据A进行读操作,不能写操作。

 

    如果一个事务A获取了某一行R的共享锁,那么另一个事务B也可以立即获取行R的共享锁,这是锁兼容。如果想要获取行R的排他锁的话,就必须等待事务释放对行R的共享锁,这种情况就是锁不兼容

    无论是排他锁还是共享锁,都是对某一数据行进行加锁,InnodB 支持多种粒度的锁,也就是行锁和表锁,为了支持多粒度锁定,InnodB引擎还引进了一种 意向锁(也是一种表锁)。

   意向锁: SQL server 想要在层次结构的某些底层资源上获取 排他锁或者共享锁。例如,放置在表级的共享意向锁表示事务打算在表中的页或者行上放置共享锁。在表级设置意向锁可以防止另一个事务随后在包含那一页的表上获取排他锁。 意向锁可以提高性能,因为SQL server仅在表级检查意向锁来确定事务是否可以安全的获取该表上的锁,而无需检查每一行或者每一页上的锁来确定事务是否可以锁定整个表。

   意向锁包括: 意向排他锁、意向共享锁、意向排他共享锁。

  更新锁: 介于共享锁和排他锁之间。可以让其他程序在不加锁的条件下读,但是本程序可以随时修改。

              更新锁可以防止通常形式的死锁。一般更新模式由一个事务组成,此事务读取记录,获取资源(页或行)的共享锁,然后修改行,此操作要求所转换为排他锁。如果两个事务获取了资源上的共享模式锁,然后试图同时更新数据,则一个事务尝试将锁转换为排他锁。共享模式到排他锁的转换需要等待一段时间,因为一个事务的排他锁和其他事务的共享模式锁不兼容;发生锁等待。第二个事务试图获取排他锁以进行更新。由于两个事务都要转换为排他锁,并且每个事务都要等待另一个事务释放共享模式锁,因此发生死锁。

    若要避免这种潜在存在的死锁问题,可以使用更新锁,一次只有一个事务可以获得资源的更新锁。如果事务修改资源,则更新锁转换为排他锁,否则,锁转换为共享锁。

MySQL的锁可以分为三种:

1.表级锁 :开销小,加锁快,不会出现死锁;锁定粒度大,发生锁冲突的概率大,并发度低;

2.行级锁 :开销大,加锁慢,会出现死锁;锁定粒度小,发生锁冲突的概率小,并发度高;

3.页面锁 :开锁和加锁时间处于表级锁和行级锁之间,会出现死锁,锁定粒度也处于二者之间,并发度一般。

死锁概念:

如果一组进程中的每一个进程都在等待仅由该组进程中其他进程才能引发的事件,那么这组进程是死锁的。

死锁的表现:死锁不仅仅可能在不同的进程中发生,也可能在同一组进程中发生。

(1)多进程死锁:假设有P1 和P2两个进程,都需要A和B两个资源,现在P1持有A 等待B资源,而P2持有B等待A资源,两个都等待另一个资源而不肯释放资源,就这样无线等待中,这就形成死锁。 

(2)单进程死锁:进程P持有资源A,但是他又在请求资源A,而它请求的资源A只有在该资源被使用完毕释放掉之后才可以被请求,这样它就陷入了自己的死锁之中。

死锁的原因

(1)进程推进顺序不当造成死锁。

(2)竞争不可抢占性资源造成死锁。

(3)竞争可消耗性资源造成死锁。

死锁的四个必要条件(缺一不可)

(1)互斥条件 :某段时间内,一个资源一次只能被一组进程所访问使用。

(2)请求和保持条件: 进程A此时已经获得一个资源,它又去申请其他资源,但该资源此时被其他进程占用,那么此时请求进程堵塞,但对它自己已经获得的资源又保持不释放。

(3)不可抢占资源:进程获得的资源未使用完不能被抢占,只能自己使用完进行释放。

(4)循环等待序列:存在一个循环等待队列p0,p1,p2,p3....pn,p0请求正在被p1占用的资源,p1请求正在被p2占用的资源,p2请求正在被p3占用的资源......pn请求正在被p0占用的资源。

解决死锁的办法:

(1)终止(撤销)进程: 终止(撤销)一个或者多个进程,将系统从循环环路中解放出来。

(2)抢占资源:从一个或多个进程中抢占足够的资源,分配给死锁进程,以打破死锁状态。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值