mysql锁2

死锁:mysql

指两个事务或者多个事务在同一资源上相互占用,并请求对方所占用的资源,从而形成恶性循环的现象。 sql

出现死锁的缘由: 数据库

系统资源不足; 
进程运行推动的顺序不当; 
资源分配不当。 并发

产生死锁的四个必要条件: 
互斥条件: 一个资源只能被一个进程使用;
请求和保持条件:进行得到必定资源,又对其余资源发起了请求,可是其余资源被其余线程占用,请求阻塞,可是也不会释放本身占用的资源;
不可剥夺条件: 指进程所得到的资源,不可能被其余进程剥夺,只能本身释放;
环路等待条件: 进程发生死锁,必然存在着进程-资源之间的环形链。.net

数据库也会发生死锁的现象,数据库系统实现了各类死锁检测和死锁超时机制来解除死锁,锁监视器进行死锁检测,MySQL的InnoDB处理死锁的方式是将持有最少行级排它锁的事务进行回滚。线程

常见的三种避免死锁的方法:版本控制

若是不一样程序会并发存取多个表,尽可能约定以相同的顺序访问表,能够大大下降死锁机会;对象

在同一个事务中,尽量作到一次锁定所须要的全部资源,减小死锁产生几率;blog

对于很是容易产生死锁的业务部分,能够尝试使用升级锁定颗粒度,经过表级锁定来减小死锁产生的几率。进程

乐观锁和悲观锁都是为了解决并发控制问题, 乐观锁能够认为是一种在最后提交的时候检测冲突的手段,而悲观锁则是一种避免冲突的手段。 

乐观锁:

乐观锁应用系统层面和数据的业务逻辑层次上的(实际上并无加锁,只不过你们一直这样叫而已),利用程序处理并发, 它假定当某一个用户去读取某一个数据的时候,其余的用户不会来访问修改这个数据,可是在最后进行事务的提交的时候会进行版本的检查,以判断在该用户的操做过程当中,没有其余用户修改了这个数据。

乐观锁不是数据库自带的,须要咱们本身去实现。乐观锁的实现大部分都是基于版本控制实现的,级别高低是:脏读 < 不可重复读 < 幻读(级别介绍详细见数据库的事务隔离级别)。 除此以外,还能够经过时间戳的方式,经过提早读取,过后对比的方式实现。

悲观锁:

每次拿数据的时候都认为别的线程会修改数据,因此在每次拿的时候都会给数据上锁。上锁以后,当别的线程想要拿数据时,就会阻塞,直到给数据上锁的线程将事务提交或者回滚。传统的关系型数据库里就用到了不少这种锁机制,好比行锁,表锁,共享锁,排他锁等,都是在作操做以前先上锁。与乐观锁相对应的,悲观锁是由数据库本身实现,要用的时候,咱们直接调用数据库的相关语句就能够。

共享锁和排它锁是悲观锁的不一样的实现,它俩都属于悲观锁的范畴。

共享锁:

共享锁又称为读锁,简称S锁,共享锁就是多个事务对于同一数据能够共享一把锁,都能访问到数据,可是只能读不能修改。

好比事务T对数据对象A加上S锁,则事务T只能读A;其余事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这就保证了其余事务能够读A,但在T释放A上的S锁以前不能对A作任何修改。

排他锁:

排他锁又称为写锁,简称X锁,排他锁就是不能与其余所并存,如一个事务获取了一个数据行的排他锁,其余事务就不能再获取该行的其余锁,包括共享锁和排他锁,可是获取排他锁的事务是能够对数据就行读取和修改。

好比事物T对数据对象A加上X锁,则只容许T读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。它防止任何其它事务获取资源上的锁,直到在事务的末尾将资源上的原始锁释放为止。

注意:

mysql InnoDB引擎默认的修改数据语句,update,delete,insert都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁类型,若是加排他锁可使用select ...for update语句,加共享锁可使用select ... lock in share mode语句。因此加过排他锁的数据行在其余事务种是不能修改数据的,也不能经过for update和lock in share mode锁的方式查询数据,但能够直接经过select ...from...查询数据,由于普通查询没有任何锁机制。--------------------- 做者:一骑走烟尘 来源:CSDN 原文:https://blog.csdn.net/zgcr654321/article/details/82345087 版权声明:本文为博主原创文章,转载请附上博文连接!

相关文章
相关标签/搜索