1 为什么需要锁

  数据库是一个多用户共享的资源,当多个用户并发的存储数据时,数据库就会产生多个事物同时存储同一数据的情况。若对并发操作不加控制就可能读取或存取不正确的数据,破坏数据的不正确性(脏读,不可重复读,幻读等),可能产生死锁。为了解决这个问题,加锁是一个非常重要的技术,对实现数据库并发控制是一个好的方案。简单来说,当执行SQL语句事物前,应向数据库发出请求,对你访问的记录加锁。在这个事物释放锁之前,其他事物不能对这个数据进行更新操作。

2 有哪些锁

  MySQL数据库中的锁有共享锁、排他锁、行锁、表级锁、行级锁以及页面锁。

2.1 共享锁(Shared Lock,也叫S锁)

  共享锁(S)表示对数据进行读操作,因此多个事物可以同时为一个对象加锁。这个事物释放锁之前,其他事物不能对该对象进行更新操作。产生共享锁的语句是:

select * from t_user lock in share mode;

2.2 排他锁(Exclusive Lock,也叫X锁)

  排他锁表示对数据进行写操作,如果一个事物给一个对象添加了排他锁,其他事物就不能给他加其他锁。产生排他锁的SQL语句如下:

select * from ad_plan for update;

2.3 行锁

  行锁表示对一条记录加锁,只影响一条记录。通常用在DML语句中,如INSERT, UPDATE, DELETE等。
  InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的。
  InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!

2.4 锁的密度

  根据锁的级别或密度来划分,MySQL有三种锁的级别:页级、表级、行级。

2.4.1 表级锁

  表级别的锁定是MySQL各存储引擎中最大颗粒度的锁定机制。该锁定机制最大的特点是实现逻辑非常简单,带来的系统负面影响最小。所以获取锁和释放锁的速度很快。由于表级锁一次会将整个表锁定,所以可以很好的避免困扰我们的死锁问题。
  当然,锁定颗粒度大所带来最大的负面影响就是出现锁定资源争用的概率也会最高,致使并大度大打折扣。
  使用表级锁定的主要是MyISAM,MEMORY,CSV等一些非事务性存储引擎。

2.4.2 行级锁

  行级锁定最大的特点就是锁定对象的颗粒度很小,也是目前各大数据库管理软件所实现的锁定颗粒度最小的。由于锁定颗粒度很小,所以发生锁定资源争用的概率也最小,能够给予应用程序尽可能大的并发处理能力而提高一些需要高并发应用系统的整体性能。
  虽然能够在并发处理能力上面有较大的优势,但是行级锁定也因此带来了不少弊端。由于锁定资源的颗粒度很小,所以每次获取锁和释放锁需要做的事情也更多,带来的消耗自然也就更大了。此外,行级锁定也最容易发生死锁。
  使用行级锁定的主要是InnoDB存储引擎。

2.4.3 页面锁

  页级锁定是MySQL中比较独特的一种锁定级别,在其他数据库管理软件中也并不是太常见。页级锁定的特点是锁定颗粒度介于行级锁定与表级锁之间,所以获取锁定所需要的资源开销,以及所能提供的并发处理能力也同样是介于上面二者之间。另外,页级锁定和行级锁定一样,会发生死锁。
  在数据库实现资源锁定的过程中,随着锁定资源颗粒度的减小,锁定相同数据量的数据所需要消耗的内存数量是越来越多的,实现算法也会越来越复杂。不过,随着锁定资源颗粒度的减小,应用程序的访问请求遇到锁等待的可能性也会随之降低,系统整体并发度也随之提升。
  使用页级锁定的主要是BerkeleyDB存储引擎。

数据库的锁有哪几种?语句怎么实现相关推荐

  1. MySQL数据库的锁 --- 六种分类 - 14种锁详细介绍

    MySQL锁概述 锁是计算机协调多个进程或线程并发访问某一个资源的机制,在数据库中,除传统的计算资源(CPU.RAM.I/O)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性 ...

  2. ORACLE数据库查询锁表语句sql脚本,以及删除锁信息脚本(数据库开发ETL、DBA必备)

    ORACLE数据库查询锁表语句sql脚本,以及删除锁信息脚本(数据库开发ETL.DBA必备) 文章目录 ORACLE数据库查询锁表语句sql脚本,以及删除锁信息脚本(数据库开发ETL.DBA必备) 前 ...

  3. 浅谈数据库乐观锁、悲观锁

    来自:非科班的科班 并发问题 当程序中出现并发的问题时,我们就要有相应的手段保证数据的正确性,防止多个用户在操作数据的时候,出现和预期数据不一样的现象,产生脏数据,在数据库的层面如果没有做好并发控制, ...

  4. 脏读、不可重复读 共享锁、悲观锁 和 事务五种隔离级别

    http://www.cnblogs.com/adforce/archive/2011/04/20/2021929.html 一.脏读.不可重复读.幻读 1.脏读:脏读就是指当一个事务正在访问数据,并 ...

  5. 并发编程(四):也谈谈数据库的锁机制

    首先声明,本次文章基本上都是从其他人的文章中或者论坛的回复中整理而来.我把我认为的关键点提取出来供自己学习.所有的引用都附在文后,在这里也就不一一表谢了. 第二个声明,我对于Internel DB并没 ...

  6. MySQL InnoDB 锁介绍及不同 SQL 语句分别加什么样的锁

    作者:iceman1952(本文来自作者投稿) 本文中,我们详细介绍MySQL InnoDB存储引擎各种不同类型的锁,以及不同SQL语句分别会加什么样的锁. 阅读提示 1. 本文所参考的MySQL文档 ...

  7. MySQL数据库:锁机制

    当数据库中多个事务并发存取同一数据的时候,若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性.MySQL锁机制的基本工作原理就是,事务在修改数据库之前,需要先获得相应的锁,获得锁的 ...

  8. 深入理解数据库行锁与表锁

    当插入数据时,就锁定表,这叫做"锁表":当更新数据时,就锁定行,这叫做"锁行". 锁在数据网络传输中是一个非常重要的概念,当多个用户对数据库进行操作时,会带来数 ...

  9. MySQL 锁与MVCC :数据库的锁、MVCC、当前读、快照读、锁算法、死锁

    文章目录 lock与latch 锁的类型 MVCC 一致性非锁定读(快照读) 一致性锁定读(当前读) 锁算法 死锁 锁升级 lock与latch 在了解数据库锁之前,首先就要区分开lock和latch ...

  10. mysql数据库老是被锁怎么解决_Mysql数据库全局锁是如何引起的,如何解决?

    2019-01-08 回答 乐观锁与悲观锁不同的是,它是一种逻辑上的锁,而不需要数据库提供锁机制来支持 当数据很重要,回滚或重试一次需要很大的开销时,需要保证操作的acid性质,此时应该采用悲观锁 而 ...

最新文章

  1. 洛谷 P1111 修复公路(最小生成树)
  2. java梅森素数_JAVA基础 第三篇:梅森数、梅森素数、伪素数——素数与指数的完美结合与进阶...
  3. MyBatis整合Spring的实现(2)
  4. java logging 格式化_Spring源码使用java.util.logging打印日志
  5. Silverlight.XNA(C#)跨平台3D游戏研发手记:(八)向Windows Phone移植之2D跨平台迁移
  6. Sentinel服务熔断无配置_客户自定义限流处理_削峰填谷_流量控制_速率控制_服务熔断_服务降级---微服务升级_SpringCloud Alibaba工作笔记0049
  7. GitHub 标星 11000+,阿里开源的微服务组件如何连续 10 年扛住双十一大促?
  8. a+ open python_python编程之文件操作
  9. cardBattle游戏启动场景设计
  10. 关于Base32和Base64的一点区分注意
  11. Eureka注册服务列表显示ip+端口
  12. 您可能没有权限使用网络资源,请与这台服务器的管理员联系以查明是否有访问权限
  13. 【解决】路由器设置成交换机使用
  14. 计算机网络是主要的功能在于,计算机网络最基本功能之一是()。
  15. 《水经注地图服务》下载与安装步骤
  16. 移动电影院创造中国电影市场的新增量
  17. 一次性读懂云计算中的6大热门词汇
  18. 使用降噪自编码器【DAE】对车流量数据进行降维
  19. vue bus传值(带参数),调用组件之间的方法
  20. QNX系统下开启SSH服务步骤

热门文章

  1. 小白转行学IT入职BAT应该怎么做
  2. RISC和CISC的比较VLIW、EPIC
  3. 免费天气预报接口返回15天的天气JSON格式
  4. 洛谷 U87052 一线天
  5. 用devc++表白_【重大表白墙】19级倪yl,风吹起如花般破碎的流年,而你的笑容摇晃摇晃,成为我命途中最美的点缀...
  6. 机场精细化管理_王晓鸿:BIM技术在机场工程精细化管理的应用
  7. echarts绘制地图
  8. Vue 使用 Apache Echarts 绘制地图(省市、地区)
  9. 10个免费图片站点(2020年最新)
  10. 如何给Word参考文献加方括号