返回顶部
首页 > 资讯 > 数据库 >MySQL涉及锁的问题
  • 248
分享到

MySQL涉及锁的问题

MySQL涉及锁的问题 2016-01-07 05:01:46 248人浏览 猪猪侠
摘要

如何并发的访问数据库呢?答案就是加锁。 接下来说一下,数据库的锁机制,数据库中都有哪些锁?   首先呢,锁是一种并发控制技术,锁是用来在多个用户同时访问同一个数据的时候保护数据的。 有2种基本的锁类型:   共享(S)锁:多个事务

MySQL涉及锁的问题

如何并发的访问数据库呢?答案就是加锁

接下来说一下,数据库机制,数据库中都有哪些锁?

  首先呢,锁是一种并发控制技术,锁是用来在多个用户同时访问同一个数据的时候保护数据的。

有2种基本的锁类型:

  共享(S)锁:多个事务可封锁一个共享页;任何事务都不能修改该页;通常是该页被读取完毕,S锁立即被释放。在执行select语句的时候需要给操作对象(表或一些记录)加上共享锁,但加锁之前需要检查是否有排他锁,如果没有,则可以加共享锁(一个对象上可以加N个共享锁),否则不行。共享锁通常在执行完select语句之后被释放,当然也可能是在事务结束(包括正常结束和异常结束)的时候被释放,主要取决与数据库所设置的事务隔离级别。

  排它(X)锁:仅允许一个事务封锁此页;其他任何事务必须等到X锁被释放才能对该页进行访问;X锁一直到事务结束才能被释放。执行insert、update、delete语句的时候需要给操作的对象加排它锁,在加排他锁之前必须确认该对象上没有其他任何锁,一旦加上排它锁之后,就不能再给这个对象加其他任何锁。排它锁的释放通常是在事务结束的时候(当然也有例外,就是在数据库事务隔离级别被设置为Read Uncommitted(读未提交数据)的时候,这种情况下排他锁会在执行完更新操作之后被释放,而不是在事务结束的时候)。

按锁的机制

既然使用了锁,就有出现死锁的可能。

产生死锁的四个必要条件:

  互斥条件:一个资源每次只能被一个进程使用。

  请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

  不可剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺。

  环路等待条件:若干个进程之间形成一种头尾相接的循环等待资源关系。

只要系统发生了死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

预防死锁

预防死锁的发生只需要破坏死锁产生的四个必要条件之一即可。

1)破坏互斥条件

  如果允许系统资源都能共享使用,则系统不会进入死锁状态。但有些资源根本不能同时访问,如打印机等临界资源只能互斥使用。所以破坏互斥条件而预防死锁的方法不太可行,而且在有些场合应该保护这种互斥性。

2)破坏不可剥夺条件

  当一个已保持了某些不可剥夺资源的进程,请求新的资源而得不到满足时,它必须释放已经保持的所有资源,待以后需要时再重新申请。这意味着,一个进程已占有的资源会被暂时释放,或者说是被剥夺了,或从而破坏了不可剥夺条件。

  该策略实现起来比较复杂,释放已获得的资源可能造成前一阶段工作的失效,反复地申请和释放资源会增加系统开销,降低系统吞吐量。这种方法常用于状态易于保存和恢复的资源,如CPU的寄存器及内存资源,一般不能用于打印机之类的资源。

3)破坏请求和保持的条件

  采用预先静态分配方法,即进程在运行前一次申请完它所需要的全部资源,在它的资源为满足前,不把它投入运行。一旦投入运行后,这些资源就一直归它所有,也不再提出其他资源请求,这样就可以保证系统不会发生死锁。

  这种方式实现简单,但缺点也显而易见,系统资源被严重浪费,其中有些资源可能仅在运行初期或运行快结束时才使用,甚至根本不使用。而且还会导致“饥饿”现象,当由于个别资源长期被其他进程占用时,将致使等待该资源的进程迟迟不能开始运行。

4)破坏环路等待条件

  为了破坏环路等待条件,可采用顺序资源分配法。首先给系统中的资源编号,规定每个进程,必须按编号递增的顺序请求资源,同类资源一次申请完。也就是说,只要进程提出申请分配资源Ri,则该进程在以后的资源申请种,只能申请编号大于Ri的资源。

  这种方法存在的问题时,编号必须相对稳定,这就限制了新类型设备的增加;尽管在为资源编号时已考虑到大多数作业实际使用这些资源的顺序,但也经常会发生作业使用资源的顺序与系统规定顺序不同的情况,造成资源的浪费;此外,这种按规定次序申请资源的方法,也必然会给用户的编程带来麻烦。

解除死锁

  1)从死锁进程处剥夺资源;

  2)终止部分或全部进程;

MySQL锁的粒度(即锁的级别)

Mysql各存储引擎使用了三种类型(级别)的锁定机制:行级锁定、页级锁定和表级锁定。

  1、表级锁:直接锁定整张表,在你锁定期间,其他进程无法对该表进行写操作。如果你是写锁,则其他进程则读也不允许。特点:开销小,加锁快;不会出现死锁;锁粒度最大,发生锁冲突的概率最高,并发度最低。

    MyISAM存储引擎采用的是表级锁。

    有两种模式:表共享读锁和表独占写锁。加读锁的命令:lock table 表名 read;  去掉锁的命令:unlock tables。

    支持并发插入:支持查询和插入操作并发运行(在表尾并发插入)。

    锁调度机制:写锁优先。一个进程请求某个MyISAM表的读锁,同时另一个进程也请求同一表的写锁,mysql如何处理呢?答案是写进程先获得锁。

  2、行级锁:仅对指定的记录进行加锁,这样其他进程还是可以对同一个表中的其他记录进行操作。特点:开销大,加锁慢;会出现死锁;锁粒度最小,发生锁冲突的概率最低,并发度也最高。

    InnoDB存储引擎既支持行级锁,也支持表级锁,但默认情况下是采用行级锁。

  3、页级锁:一次锁定相邻的一组记录。开销和加锁时间介于表锁和行锁之间;会出现死锁;锁定粒度介于表锁和行锁治安,并发度一般。

  最常用的处理多用户并发访问的方法是加锁。当一个用户锁定数据库中的某个对象时,其他用户就不能再访问该对象。加锁对并发访问的影响体现在锁的粒度上。比如,(表锁)放在一个表上的锁限制对整个表的并发访问;(页锁)放在数据页上的锁限制了对整个数据页的访问;(行锁)放在行上的锁只限制对该行的并发访问。

乐观锁和悲观锁的概念,实现方式和使用场景

锁有两种机制:悲观锁和乐观锁

  悲观锁,锁如其名,它对世界是悲观的,它认为别人访问正在改变的数据的概率是很高的,所以从数据开始更改时就将数据锁住,直到更改完成才释放。

一个典型的依赖数据库的悲观锁调用:

  select * from account where name="Erica" for update

  这条sql语句锁定了account表中所有符合检索条件(name="Erica")的记录。本事务提交之前(事务提交时会释放事务过程中的锁),外界无法修改这些记录。该语句用来锁定特定的行(如果where子句,就是满足where条件的那些行)。当这些行被锁定后,其他会话可以选择这些行,但不能更改或删除这些行,直到该语句的事务被commit语句或rollback语句结束终止。需要注意的是,select ...for update要放到MySQL的事务种,即begin和commit中,否则不起作用。

  悲观所可能会造成加锁的时间很长,并发行不好,特别是长事务,影响系统的整体性能。

  悲观所的实现方式:

    悲观锁,也是基于数据库的锁机制实现。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁、写锁等,都是在做操作之前先上锁。

  乐观锁,它对世界比较乐观,认为别人访问正在改变的数据的概率是很低的,所以直到修改完成准备提交所作的修改到数据库的时候才会将数据锁住,当你读取以及改变该对象时并不加锁,完成更改后释放。乐观锁不能解决脏读的问题。

  乐观锁加锁的时间要比悲观锁短,大大提升了大并发量下的系统整体性能表现。

  乐观锁的实现方式

    1、大多是基于数据版本(version)记录机制实现,需要为每一行数据增加一个版本标识(也就是每一行数据多一个字段version),每次更新数据都要更新对应的版本号+1。

    工作原理:读出数据时,将此版本一同读出,之后更新时,对此版本号加一。此时,将提交的数据的版本信息与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据,不得不重新读取该对象并作出更改。

    2、使用时间戳来实现

    同样是在需要乐观锁控制的table中增加一个字段,名称无所谓,字段类型使用时间戳(timestamp),和上面的version类似,也是在更新提交的时候检查当前数据库中数据的时间戳和自己更新前取到的时间戳进行对比,如果一致则OK,否则就是版本冲突。

悲观锁与乐观锁的适用场景:

  如果并发量不大,可以使用悲观锁解决并发问题;但如果系统的并发量非常大的话,悲观所定会带来非常大的性能问题,所以我们就要选择乐观锁定的方法。现在大部分应用都应该是乐观锁的。

您可能感兴趣的文档:

--结束END--

本文标题: MySQL涉及锁的问题

本文链接: https://lsjlt.com/news/5170.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MySQL涉及锁的问题
    如何并发的访问数据库呢?答案就是加锁。 接下来说一下,数据库的锁机制,数据库中都有哪些锁?   首先呢,锁是一种并发控制技术,锁是用来在多个用户同时访问同一个数据的时候保护数据的。 有2种基本的锁类型:   共享(S)锁:多个事务...
    99+
    2016-01-07
    MySQL涉及锁的问题
  • 涉及存储过程的问题
    存储过程(特定功能的SQL语句集)   一组为了完成特定功能的SQL语句集,存储在数据库中,经过第一次编译后再次调用不需要编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中一个重要对象。 1.创...
    99+
    2020-10-31
    涉及存储过程的问题
  • MySQL死锁问题的分析及解决方法
    这篇文章主要讲解了“MySQL死锁问题的分析及解决方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL死锁问题的分析及解决方法”吧!MySQL死锁问...
    99+
    2024-04-02
  • 常见的MySQL锁问题及其解决方案
    MySQL 锁的常见问题与解决方案MySQL 是一种常用的关系型数据库管理系统,它使用锁来实现并发控制,保证数据的一致性和完整性。然而,MySQL 锁的使用也会带来一些问题。本文将介绍一些常见的 MySQL 锁的问题,并提供相应的解决方案。...
    99+
    2023-12-21
    解决方案 常见问题 MySQL
  • MySQL中锁的相关问题
    锁分类: 从对数据操作的粒度分 : 表锁:操作时,会锁定整个表。行锁:操作时,会锁定当前操作行。 从对数据操作的类型分: 读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会...
    99+
    2024-04-02
  • MySQL之InnoDB下的锁问题
    目录背景知识获取InnoDB行锁争用情况InnoDB的行锁模式及加锁方法下面是使用 lock in share mode加共享锁的例子下面是使用for update加排他锁的例子InnoDB行锁的实现方式在不通...
    99+
    2023-08-11
    MySQL InnoDB MySQL InnoDB下锁
  • MySQL锁等待与死锁问题分析
    前言:  在 MySQL 运维过程中,锁等待和死锁问题是令各位 DBA 及开发同学非常头痛的事。出现此类问题会造成业务回滚、卡顿等故障,特别是业务繁忙的系统,出现死锁问题后影响会更严重。本篇文章我们一起来学...
    99+
    2022-05-22
    MySQL 锁等待 MySQL 死锁
  • mysql kill进程后出现killed死锁问题及解决
    目录mysql kill进程后出现killed死锁经常会出现这样的场景场景通过下列语句查询事务情况查看表锁信息总结mysql kill进程后出现killed死锁 经常会出现这样的场景 有一张3亿的表,现在要对这张表进行删...
    99+
    2024-01-29
    mysql kill进程 mysql出现killed死锁 mysql killed死锁
  • 【mysql】mysql死锁问题解决方案
    mysql死锁问题解决方案 查询出是被哪个进程给锁住了为什么会产生死锁日志内容:日志解析:找到问题: 解决方案 查询出是被哪个进程给锁住了 执行sql: select ...
    99+
    2023-09-23
    mysql adb 数据库
  • 涉及MySQL用户及权限管理的简单介绍
    本文主要给大家介绍MySQL用户及权限管理,文章内容都是笔者用心摘选和编辑的,具有一定的针对性,对大家的参考意义还是比较大的,下面跟笔者一起了解下MySQL用户及权限管理吧。 MySQL用户及权限...
    99+
    2024-04-02
  • Java死锁问题详解及示例
    目录一、死锁简介二、Java死锁产生的条件可以归纳为以下四个:三、死锁产生的原因四、避免死锁的策略五、代码示例六、诊断死锁七、总结一、死锁简介 在Java程序中,死锁是指两个或多个线...
    99+
    2023-05-18
    Java 死锁 Java死锁示例
  • dblink涉及的表的赋权
    A上面用户user_a有访问B的DBLINK,B_dblink,在A库的用户user_a上执行如下授权,授权dblink的table1给A库的user_b grant select on table1...
    99+
    2024-04-02
  • MySQL查询缓存涉及多少参数
    本篇文章给大家分享的是有关MySQL查询缓存涉及多少参数,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 查询缓存...
    99+
    2024-04-02
  • 怎样解决Mysql死锁问题
    怎样解决Mysql死锁问题,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 show engine in...
    99+
    2024-04-02
  • 如何处理MySQL死锁问题
    小编给大家分享一下如何处理MySQL死锁问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! MySQL里的锁兼容列表大体是这样...
    99+
    2024-04-02
  • Mysql如何解决死锁问题
    这篇文章主要为大家展示了“Mysql如何解决死锁问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Mysql如何解决死锁问题”这篇文章吧。 ...
    99+
    2024-04-02
  • 如何解决MySQL死锁问题
    这篇文章主要介绍“如何解决MySQL死锁问题”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何解决MySQL死锁问题”文章能帮助大家解决问题。1、什么是死锁死锁是并...
    99+
    2024-04-02
  • 如何解决mysql行锁问题
    解决mysql行锁问题的方法打开mysql终端命令符窗口,根据以下步骤解决。查询是否锁表,代码:“show OPEN TABLES where In_use > 0;”查询进程,代码:“show processlist”,再...
    99+
    2024-04-02
  • Mysql并发插入死锁问题
    文章目录 一、问题二、复现表结构执行顺序死锁信息 三、死锁原因四、修改代码FA&QReference 一、问题 线上数据库版本,隔离级别:5.6.36-log,REPEA...
    99+
    2023-10-10
    mysql 数据库 sql 死锁
  • Java调用shell命令涉及管道、重定向时不生效问题及解决
    目录Java调用shell命令涉及管道、重定向时不生效Java执行shell遇到的各种问题1、判断子进程是否执行结束2、Process.waitFor()导致当前线程阻塞3、shel...
    99+
    2022-12-23
    Java调用shell命令 Java shell命令管道 重定向不生效
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作