首页 > 数据库 >数据库 锁

数据库 锁

时间:2023-04-20 12:47:45浏览次数:34  
标签:... 事务 加锁 行级 数据库 数据 表级

一、行级锁,表级锁和页级锁

   在关系型数据库中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎)、表级锁(MYISAM引擎)和页级锁(BDB引擎 )。
        MyISAM和InnoDB存储引擎使用的锁:
          MyISAM采用表级锁(table-level locking)。
          InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁
        行级锁:

    级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但加锁的开销也最大。行级锁分为 共享锁 和 排他锁
          特点:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
        表级锁:

    表级锁是MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持。最常使用的MYISAM与INNODB都支持表级锁定。表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)。
          特点:开销小,加锁快;不会出现死锁;锁定粒度大,发出锁冲突的概率最高,并发度最低。
        页级锁:

    页级锁是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折中的页级,一次锁定相邻的一组记录。
          特点:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

 

二、共享锁 和 排他锁

  行级锁中的共享锁与排他锁

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

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

  排他锁锁住一行数据后,其他事务就不能读取和修改该行数据,其实不是这样的。

    排他锁指的是一个事务在一行数据加上排他锁后,其他事务不能再在其上加其他的锁。mysql InnoDB引擎默认的修改数据语句,update,delete,insert都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁类型,如果加排他锁可以使用select ...for update语句,加共享锁可以使用select ... lock in share mode语句。所以加过排他锁的数据行在其他事务种是不能修改数据的,也不能通过for update和lock in share mode锁的方式查询数据,但可以直接通过select ...from...查询数据,因为普通查询没有任何锁机制。

 

三、意向锁
  使用意向锁(Intention Locks)可以更容易地支持多粒度封锁。
  在存在行级锁和表级锁的情况下,事务 T 想要对表 A 加 X 锁,就需要先检测是否有其它事务对表 A 或者表 A 中的任意一行加了锁,那么就需要对表 A 的每一行都检测一次,这是非常耗时的。
  意向锁在原来的 X/S 锁之上引入了 IX/IS,IX/IS 都是表锁,用来表示一个事务想要在表中的某个数据行上加 X 锁或 S 锁。有以下两个规定:
    一个事务在获得某个数据行对象的 S 锁之前,必须先获得表的 IS 锁或者更强的锁;
    一个事务在获得某个数据行对象的 X 锁之前,必须先获得表的 IX 锁。
  通过引入意向锁,事务 T 想要对表 A 加 X 锁,只需要先检测是否有其它事务对表 A 加了 X/IX/S/IS 锁,如果加了就表示有其它事务正在使用这个表或者表中某一行的锁,因此事务 T 加 X 锁失败。

  各种锁的兼容关系如下:
    解释如下:
      任意 IS/IX 锁之间都是兼容的,因为它们只表示想要对表加锁,而不是真正加锁;
      这里兼容关系针对的是表级锁,而表级的 IX 锁和行级的 X 锁兼容,两个事务可以对两个数据行加 X 锁。(事务 T1 想要对数据行 R1 加 X 锁,事务 T2 想要对同一个表的数据行 R2 加 X 锁,两个事务都需要对该表加 IX 锁,但是 IX 锁是兼容的,并且 IX 锁与行级的 X 锁也是兼容的,因此两个事务都能加锁成功,对同一个表中的两个数据行做修改。)


四、封锁协议
  1.、三级封锁协议
    一级封锁协议
      事务 T 要修改数据 A 时必须加 写 锁,直到 T 结束才释放锁。
      可以解决丢失修改问题,因为不能同时有两个事务对同一个数据进行修改,那么事务的修改就不会被覆盖。
    二级封锁协议
      在一级的基础上,要求读取数据 A 时必须加 读 锁,读取完马上释放 读 锁。
      可以解决读脏数据问题,因为如果一个事务在对数据 A 进行修改,根据 1 级封锁协议,会加 写 锁,那么就不能再加 读 锁了,也就是不会读入数据。
    三级封锁协议
      二级的基础上,要求读取数据 A 时必须加 读 锁,直到事务结束了才能释放 读 锁。
      可以解决不可重复读的问题,因为读 A 时,其它事务不能对 A 加 写 锁,从而避免了在读的期间数据发生改变。
  2、两段锁协议
    加锁和解锁分为两个阶段进行。
    可串行化调度是指,通过并发控制,使得并发执行的事务结果与某个串行执行的事务结果相同。串行执行的事务互不干扰,不会出现并发一致性问题。
    事务遵循两段锁协议是保证可串行化调度的充分条件。例如以下操作满足两段锁协议,它是可串行化调度。
    lock-x(A)...lock-s(B)...lock-s(C)...unlock(A)...unlock(C)...unlock(B)
    但不是必要条件,例如以下操作不满足两段锁协议,但它还是可串行化调度。
    lock-x(A)...unlock(A)...lock-s(B)...unlock(B)...lock-s(C)...unlock(C)
  MySQL 隐式与显式锁定
    MySQL 的 InnoDB 存储引擎采用两段锁协议,会根据隔离级别在需要的时候自动加锁,并且所有的锁都是在同一时刻被释放,这被称为隐式锁定。
    InnoDB 也可以使用特定的语句进行显示锁定:
      SELECT ... LOCK In SHARE MODE;
      SELECT ... FOR UPDATE;

 

 五、乐观锁和悲观锁
        数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。

  乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段。

    乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。在修改数据的时候把事务锁起来,通过version的方式来进行锁定。实现方式:一般会使用版本号机制或CAS算法实现。
          悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。在查询完数据的时候就把事务锁起来,直到提交事务。实现方式:使用数据库中的锁机制
  使用场景

    乐观锁适用于写比较少的情况下(多读场景),即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。
         但如果是多写的情况,一般会经常产生冲突,这就会导致上层应用会不断的进行retry,这样反倒是降低了性能,所以一般多写的场景下用悲观锁就比较合适 

 

标签:...,事务,加锁,行级,数据库,数据,表级
From: https://www.cnblogs.com/kldywx/p/17336295.html

相关文章

  • 数据库3.49到3.68例程
    3.49查询每个学生及其选修课程的情况3.50对[例33]用自然连接完成3.51查询选修2号课程且成绩在90分以上的所有学生的学号和姓名。3.52查询每一门课的间接先修课(即先修课的先修课)3.53改写[3.49查询每个学生及其选修课程的情况3.54查询每个学生的学号、姓名、选修的......
  • 记录一次使用 表达式引擎 自定义注解 还有 sql union all 实现对数据库数据提取、重组
    这样编写减少了前后端很多没必要的遍历,以及if判断并最大限度提高了代码的可变通性额外需要学习的是ORM框架下,如何接收多表(各表结构不同)操作后,sql返回的新结构的临时表问题表达式引擎用到的依赖<dependency><groupId>org.apache.commons</groupId>......
  • 关于DB2数据库基本信息查询语句
    1.1数据库的启停启动数据库:db2start关闭数据库:db2stop(在关闭前先执行db2forceapplicationall(关闭所有正在执行的连接))或者直接执行db2stopforce(不是优先选择))#--有时候db2forceapplicationall关闭不了一些active的连接时可以使用db2stopforce1.2数据库的创建及删......
  • 虹科干货 | 打破传统!金融界黑科技—虹科Redis企业版数据库
    金融行业数字化转型浪潮来袭,客户需求也正加速向在线金融服务转移。金融机构想要实现现代化改造技术堆栈,为客户提供实时交互、欺诈检测等一系列个性化创新服务,就必须重视遗留系统和传统数据库架构“老年病”问题!面对数字化颠覆带来的挑战和压力,接受变化是关键!一些极力打破传统束......
  • 数据库基础概述
    (一)数据库基础1.什么是数据库数据库这个术语的用法很多,一般来说,数据库是一个以某种有组织的方式存储的数据集合。理解数据库的一种最简单的办法是将其想象为一个文件柜。此文件柜是一个存放数据的物理位置,不管数据是什么以及如何组织的。数据库(database):保存有组织的数据的容器......
  • go项目中数据库连接,以及redis连接
     文件:common/mysql.go数据库连接文件packagecommonimport("gorm.io/driver/mysql""gorm.io/gorm""gorm.io/gorm/schema""log")varDB*gorm.DB//全局定义DBvardbErrerror//定义数据库错误funcinit(){dsn:=......
  • 56 openEuler搭建Mariadb数据库服务器-安装、运行和卸载
    56openEuler搭建Mariadb数据库服务器-安装、运行和卸载56.1安装配置本地yum源,详细信息请参考《openEuler22.03-LTS搭建repo服务器》。清除缓存。#dnfcleanall例如示例命令如下:[root@superman-21~]#dnfcleanall45filesremoved[root@superman-21~]#......
  • Shell多线程备份数据库
    Shell这么简单的脚本语言有多线程这一说吗?答案是有的。只不过它实现起来稍微有点难理解罢了,因为它借助了命名管道实现。所谓多线程就是原本由一个进程完成的事情现在由多个线程去完成。假如一个进程需要10小时完成的事情,现在分配10个线程,给他们分工,然后同时去做这件事情,最终可能就......
  • MySQL数据库事务
    什么是数据库事务数据库事务(transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。数据库事务的四大特性数据库事务的四大特性和程序事务相同,......
  • 图数据库 NebulaGraph 的 Java 数据解析实践与指导
    如何快速、即时、符合直觉地去处理NebulaJavaClient中的数据解析?读这一篇就够了。图数据库NebulaGrpah的论坛和微信群里,有不少用户问及了Java客户端数据解析的问题。在本文教你一种简单的方式同返回结果交互,快速、即时地拿到解析数据。愉快、干净的Java交互环境本......