精华内容
下载资源
问答
  • mysql锁机制面试题
    千次阅读
    2020-07-03 12:54:30

    对MySQL的锁了解吗?

    当数据库有并发事务的时候,可能会产生数据的不一致,这时候需要一些机制来保证访问的次序,锁机制就是这样的一个机制。

    例子:就像酒店的房间,如果大家随意进出,就会出现多人抢夺一个房间的情况,而在房间上装上所,申请盗钥匙的人才可以入住并且将房间锁起来,其他人只有等他使用完毕才可以使用。

    隔离级别与锁的关系

    在Read Uncommited级别下,读取数据不需要加共享锁,这样就不会跟被修改的数据上的排他锁冲突。

    在Read Commited级别下,读操作需要加共享锁,但是在语句执行完以后释放共享锁。

    在Repeatable Read级别下,读操作需要加共享锁,但是在事务提交之前并不释放共享锁,也就是必须等待事务执行完毕以后才释放共享锁。

    Serializable是限制性最强的隔离级别,因为该级别锁定整个范围的键,并一直持有锁,直到事务完成。

    按照锁的粒度分数据库锁有哪些?锁机制与InnoDB锁算法

    在关系型数据库中,可以按照锁的粒度把数据库锁分为行级锁(InnoDB引擎)、表级锁(MyISAM引擎)和页级锁(BDB引擎)。

    MyISAM和InnoDB使用的锁:

    1、MyISAM使用表级锁。

    2、InnoDB支持行级锁和表级锁,默认为行级锁。

    行级锁和表级锁对比

    行级锁

    行级锁是MySQL中锁定粒度最细的一种锁,表示只针对当前操作的行(Row)进行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但加锁的开销也最大。行级锁分为共享锁和排他锁。

    特点:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突概率最低,并发度也最高。

     

    表级锁

    表级锁是MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持。最常用的MyISAM与InnoDB都支持表级锁。表级锁分为表共享读锁(共享锁)与表独占写锁(排他锁)。

    特点:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。

     

    从锁的分类来说,MySQL都有哪些锁?

    从锁的类别来讲,有共享锁和排他锁。

    共享锁

    又叫读锁。当用户要进行数据读取时,对数据加上共享锁。共享锁可以同时加上多个。

    排他锁

    又叫写锁。当用户要进行数据的写入时,对数据加上排他锁。排他锁只可以加一个,它和其它排他锁、共享锁都互斥。

    例子

    假设用户行为有两种,一种是来看房,多个用户一起看房是可以接受的。一种是真正的入住一晚,在这期间,无论是像入住还是想看房都是不可以的。

     

    锁的粒度取决于具体的存储引擎,InnoDB实现了行级锁,页级锁,表级锁。它们的加锁开销从大到小,

    并发能力也是从大到小。

     

    MySQL中InnoDB引擎的行锁是怎么实现的?

    InnoDB是基于索引来完成行级锁的。

    例如:select * from tab_with_index where id = 1 for update;

    for update可以根据条件来完成行级锁顶,并且id是有索引键的列,如果id不是索引键那么InnoDB将完成表锁,并发将无从谈起。

    InnoDB存储引擎的锁的算法有三种

    1、record lock:单个行记录上的锁

    2、gap lock:间隙锁,锁定一个范围,不包括记录本身

    3、next-key lock:record + gap锁顶一个范围,包含记录本身

    相关知识点:

    1、InnoDB对于行的查询使用next-key lock

    2、next-locking keying为了解决幻读问题

    3、当查询的索引含有唯一属性时,将next-key lock降级为record lock

    4、gap锁设计的目的是为了阻止多个事务将记录插入到同意范围内,而这会导致幻读问题的产生

    5、有两种方式显式关闭gap锁:(除了外键约束和唯一性检查外,其余情况仅使用record lock)

          A、将事务隔离级别设置为RC;

          B、将参数innodb_locks_unsafe_for_binlog设置为1

    什么是死锁?如何解决?

    死锁是指两个或多个事务在同一资源上向胡战勇,并请求锁定对方的资源,从而导致恶性循环。

    解决方案:

    1、如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低发生死锁的风险。

    2、同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率。

    3、对于非常容易产生死锁的业务部分,可以尝试升级锁定粒度,通过表级锁定来减少死锁产生的概率。

    数据库的乐观锁和悲观锁是什么?怎么实现的?

    数据库管理系统中的并发控制的任务是确保在多个事务同时存取数据库中同一份数据时不破坏事务的隔离性和统一性以及数据库的统一性。乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段。

    悲观锁

    假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。在查询完数据的时候就把事务锁起来,直到提交事务。

    实现方式:使用数据库中的锁机制。

    乐观锁

    假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。在修改数据的时候把事务锁起来,通过版本控制的方式来进行锁定。

    实现方式:一般会使用版本号机制或CAS算法实现。

     

    乐观锁和悲观锁的使用场景

    从上面对两种锁的介绍,我们知道两种锁各有优缺点,不可认为一种好于另一种,像乐观锁适用于写操作比较少的情况下(多读场景,也就是并发写操作较低的场景),即冲突真的很少发生的时候,这样可以省去加锁的开销,加大了整个系统的吞吐量。

    但如果是并发写操作较多的情况下,一般会经常产生冲突,这就会导致上层应用会不断的进行retry,这样的话使用乐观锁反而是降低了性能,所以一般并发写操作较多的场景下使用悲观锁比较合适。

     

    文章来自各大论坛和平台,并非本人原创,但是无奈找不到一个具体来源,故类别上写为原创。侵删。

    更多相关内容
  • MySQL 提供了全局、行级、表级。其中 InnoDB 支持表级和行级,MyISAM 只支持表级。什么是死锁?是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将...

    什么是锁?MySQL 中提供了几类锁?

    锁是实现数据库并发控制的重要手段,可以保证数据库在多人同时操作时能够正常运行。MySQL 提供了全局锁、行级锁、表级锁。其中 InnoDB 支持表级锁和行级锁,MyISAM 只支持表级锁。

    什么是死锁?

    是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的过程称为死锁。

    死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的过程称为死锁。

    常见的死锁案例有哪些?

    将投资的钱拆封几份借给借款人,这时处理业务逻辑就要把若干个借款人一起锁住 select * from xxx where id in (xx,xx,xx) for update。

    批量入库,存在则更新,不存在则插入。解决方法 insert into tab(xx,xx) on duplicate key update xx='xx'。

    如何处理死锁?

    对待死锁常见的两种策略:

    通过 innodblockwait_timeout 来设置超时时间,一直等待直到超时;

    发起死锁检测,发现死锁之后,主动回滚死锁中的某一个事务,让其它事务继续执行。

    如何查看死锁?

    使用命令 show engine innodb status 查看最近的一次死锁。

    InnoDB Lock Monitor 打开锁监控,每 15s 输出一次日志。使用完毕后建议关闭,否则会影响数据库性能。

    如何避免死锁?

    为了在单个 InnoDB 表上执行多个并发写入操作时避免死锁,可以在事务开始时通过为预期要修改的每个元祖(行)使用 SELECT ... FOR UPDATE 语句来获取必要的锁,即使这些行的更改语句是在之后才执行的。

    在事务中,如果要更新记录,应该直接申请足够级别的锁,即排他锁,而不应先申请共享锁、更新时再申请排他锁,因为这时候当用户再申请排他锁时,其他事务可能又已经获得了相同记录的共享锁,从而造成锁冲突,甚至死锁

    如果事务需要修改或锁定多个表,则应在每个事务中以相同的顺序使用加锁语句。在应用中,如果不同的程序会并发存取多个表,应尽量约定以相同的顺序来访问表,这样可以大大降低产生死锁的机会

    通过 SELECT ... LOCK IN SHARE MODE 获取行的读锁后,如果当前事务再需要对该记录进行更新操作,则很有可能造成死锁。

    改变事务隔离级别。

    InnoDB 默认是如何对待死锁的?

    InnoDB 默认是使用设置死锁时间来让死锁超时的策略,默认 innodblockwait_timeout 设置的时长是 50s。

    如何开启死锁检测?

    设置 innodbdeadlockdetect 设置为 on 可以主动检测死锁,在 Innodb 中这个值默认就是 on 开启的状态。

    什么是全局锁?它的应用场景有哪些?

    全局锁就是对整个数据库实例加锁,它的典型使用场景就是做全库逻辑备份。 这个命令可以使整个库处于只读状态。使用该命令之后,数据更新语句、数据定义语句、更新类事务的提交语句等操作都会被阻塞。

    什么是共享锁?

    共享锁又称读锁 (read lock),是读取操作创建的锁。其他用户可以并发读取数据,但任何事务都不能对数据进行修改(获取数据上的排他锁),直到已释放所有共享锁。当如果事务对读锁进行修改操作,很可能会造成死锁。

    什么是排它锁?

    排他锁 exclusive lock(也叫 writer lock)又称写锁。

    若某个事物对某一行加上了排他锁,只能这个事务对其进行读写,在此事务结束之前,其他事务不能对其进行加任何锁,其他进程可以读取,不能进行写操作,需等待其释放。

    排它锁是悲观锁的一种实现,在上面悲观锁也介绍过。

    若事务 1 对数据对象 A 加上 X 锁,事务 1 可以读 A 也可以修改 A,其他事务不能再对 A 加任何锁,直到事物 1 释放 A 上的锁。这保证了其他事务在事物 1 释放 A 上的锁之前不能再读取和修改 A。排它锁会阻塞所有的排它锁和共享锁。

    使用全局锁会导致什么问题?

    如果在主库备份,在备份期间不能更新,业务停摆,所以更新业务会处于等待状态。

    如果在从库备份,在备份期间不能执行主库同步的 binlog,导致主从延迟。

    如何处理逻辑备份时,整个数据库不能插入的情况?

    如果使用全局锁进行逻辑备份就会让整个库成为只读状态,幸好官方推出了一个逻辑备份工具 MySQLdump 来解决了这个问题,只需要在使用 MySQLdump 时,使用参数 -single-transaction 就会在导入数据之前启动一个事务来保证数据的一致性,并且这个过程是支持数据更新操作的。

    如何设置数据库为全局只读锁?

    使用命令 flush tables with read lock(简称 FTWRL)就可以实现设置数据库为全局只读锁。

    除了 FTWRL 可以设置数据库只读外,还有什么别的方法?

    除了使用 FTWRL 外,还可以使用命令 set global readonly=true 设置数据库为只读。

    FTWRL 和 set global readonly=true 有什么区别?

    FTWRL 和 set global readonly=true 都是设置整个数据库为只读状态,但他们最大的区别就是,当执行 FTWRL 的客户端断开之后,整个数据库会取消只读,而 set global readonly=true 会一直让数据处于只读状态。

    如何实现表锁?

    MySQL 里标记锁有两种:表级锁、元数据锁(meta data lock)简称 MDL。表锁的语法是 lock tables t read/write。

    可以用 unlock tables 主动释放锁,也可以在客户端断开的时候自动释放。lock tables 语法除了会限制别的线程的读写外,也限定了本线程接下来的操作对象。

    对于 InnoDB 这种支持行锁的引擎,一般不使用 lock tables 命令来控制并发,毕竟锁住整个表的影响面还是太大。

    MDL:不需要显式使用,在访问一个表的时候会被自动加上。

    MDL 的作用:保证读写的正确性。

    在对一个表做增删改查操作的时候,加 MDL 读锁;当要对表做结构变更操作的时候,加 MDL 写锁。

    读锁之间不互斥,读写锁之间,写锁之间是互斥的,用来保证变更表结构操作的安全性。

    MDL 会直到事务提交才会释放,在做表结构变更的时候,一定要小心不要导致锁住线上查询和更新。

    悲观锁和乐观锁有什么区别?

    顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会 block 直到它拿到锁。正因为如此,悲观锁需要耗费较多的时间,另外与乐观锁相对应的,悲观锁是由数据库自己实现了的,要用的时候,我们直接调用数据库的相关语句就可以了。

    说到这里,由悲观锁涉及到的另外两个锁概念就出来了,它们就是共享锁与排它锁。共享锁和排它锁是悲观锁的不同的实现,它俩都属于悲观锁的范畴。

    乐观锁是用数据版本(Version)记录机制实现,这是乐观锁最常用的一种实现方式。何谓数据版本?即为数据增加一个版本标识,一般是通过为数据库表增加一个数字类型的 version 字段来实现。当读取数据时,将 version 字段的值一同读出,数据每更新一次,对此 version 值加 1。当我们提交更新的时候,判断数据库表对应记录的当前版本信息与第一次取出来的version值进行比对,如果数据库表当前版本号与第一次取出来的 version 值相等,则予以更新,否则认为是过期数据。

    比如: 1、数据库表三个字段,分别是id、value、version select id,value,version from t where id=#{id} 2、每次更新表中的value字段时,为了防止发生冲突,需要这样操作

    update t

    set value=2,version=version+1

    where id=#{id} and version=#{version}

    乐观锁有什么优点和缺点?

    因为没有加锁所以乐观锁的优点就是执行性能高。它的缺点就是有可能产生 ABA 的问题,ABA 问题指的是有一个变量 V 初次读取的时候是 A 值,并且在准备赋值的时候检查到它仍然是 A 值,会误以为没有被修改会正常的执行修改操作,实际上这段时间它的值可能被改了其他值,之后又改回为 A 值,这个问题被称为 ABA 问题。

    InnoDB 存储引擎有几种锁算法?

    Record Lock — 单个行记录上的锁;

    Gap Lock — 间隙锁,锁定一个范围,不包括记录本身;

    Next-Key Lock — 锁定一个范围,包括记录本身。

    InnoDB 如何实现行锁?

    行级锁是 MySQL 中粒度最小的一种锁,他能大大减少数据库操作的冲突。

    INNODB 的行级锁有共享锁(S LOCK)和排他锁(X LOCK)两种。共享锁允许事物读一行记录,不允许任何线程对该行记录进行修改。排他锁允许当前事物删除或更新一行记录,其他线程不能操作该记录。

    共享锁:SELECT ... LOCK IN SHARE MODE,MySQL 会对查询结果集中每行都添加共享锁,前提是当前线程没有对该结果集中的任何行使用排他锁,否则申请会阻塞。

    排他锁:select * from t where id=1 for update,其中 id 字段必须有索引,MySQL 会对查询结果集中每行都添加排他锁,在事物操作中,任何对记录的更新与删除操作会自动加上排他锁。前提是当前没有线程对该结果集中的任何行使用排他锁或共享锁,否则申请会阻塞。

    优化锁方面你有什么建议?

    尽量使用较低的隔离级别。

    精心设计索引, 并尽量使用索引访问数据, 使加锁更精确, 从而减少锁冲突的机会。

    选择合理的事务大小,小事务发生锁冲突的几率也更小。

    给记录集显示加锁时,最好一次性请求足够级别的锁。比如要修改数据的话,最好直接申请排他锁,而不是先申请共享锁,修改时再请求排他锁,这样容易产生死锁。

    不同的程序访问一组表时,应尽量约定以相同的顺序访问各表,对一个表而言,尽可能以固定的顺序存取表中的行。这样可以大大减少死锁的机会。

    尽量用相等条件访问数据,这样可以避免间隙锁对并发插入的影响。

    不要申请超过实际需要的锁级别。

    除非必须,查询时不要显示加锁。 MySQL 的 MVCC 可以实现事务中的查询不用加锁,优化事务性能;MVCC 只在 COMMITTED READ(读提交)和 REPEATABLE READ(可重复读)两种隔离级别下工作。

    对于一些特定的事务,可以使用表锁来提高处理速度或减少死锁的可能。

    展开全文
  • Mysql面试必问)

    按锁粒度从大到小分类:表锁,页锁行锁;以及特殊场景下使用的全局锁

    如果按锁级别分类则有:共享(读)锁、排他(写)锁、意向共享(读)锁、意向排他(写)锁;还有就是我们面向编程的两种锁思想:悲观锁、乐观锁

    表锁:表级别的锁定是MySQL各存储引擎中最大颗粒度的锁定机制。该锁定机制最大的特点是实现逻辑非常简单,带来的系统负面影响最小。所以获取锁和释放锁的速度很快。由于表级锁一次会将整个表锁定,所以可以很好的避免困扰我们的死锁问题。表级锁定的主要是MyiSAM引擎

    行锁:与表锁正相反,行锁最大的特点就是锁定对象的颗粒度很小,也是目前各大数据库管理软件所实现的锁定颗粒度最小的。由于锁定颗粒度很小,所以发生锁定资源争用的概率也最小,能够给予应用程序尽可能大的并发处理能力从而提高系统的整体性能。

      虽然能够在并发处理能力上面有较大的优势,但是行级锁定也因此带来了不少弊端。由于锁定资源的颗粒度很小,所以每次获取锁和释放锁需要做的事情也更多,带来的消耗自然也就更大了。此外,行级锁定也最容易发生死锁。

      使用行级锁定的主要是InnoDB存储引擎

    页锁:相对偏中性的页级锁,页锁是MySQL中比较独特的一种锁定级别,在其他数据库管理软件中也并不是太常见。页级锁定的特点是锁定颗粒度介于行级锁定与表级锁之间,所以获取锁定所需要的资源开销,以及所能提供的并发处理能力也同样是介于上面二者之间。另外,页级锁定和行级锁定一样,会发生死锁。

    全局锁:是对整个数据库实例加锁。使用场景一般在全库逻辑备份时

    悲观锁:就是比较悲观的锁,总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁,Java中synchronized是悲观锁思想的实现

    乐观锁:总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制CAS算法实现,适用于多读的应用类型,这样可以提高吞吐量。

    锁的颗粒度:

    在给定的资源上,锁定的数据量越少,则系统的并发程度越高,如果系统花费大量的时间来管理锁,而不是存取数据,那么系统的性能可能会因此受到影响

    展开全文
  • 脏读、不可重读度、幻读,其实都是数据库的一致性问题,必须由一定的事务隔离机制来解决。性能高和事务完全隔离性无法同时满足,DB提供了4项事务隔离级别来权衡,需要用户根据自身业务来选择合适的隔离级别。隔离...
  • MySQL面试题——锁机制

    千次阅读 2020-08-08 17:16:45
    1.MySQL锁机制 当数据库有并发事务的时候,可能会产生数据不一致,这时候就需要一些机制来保证访问的次序,锁机制就是这样的一个机制 2.隔离级别与锁的关系 在未提交读级别下,读取数据不需要加共享锁 在提交读...

    1.MySQL的锁机制

    当数据库有并发事务的时候,可能会产生数据不一致,这时候就需要一些机制来保证访问的次序,锁机制就是这样的一个机制

    2.隔离级别与锁的关系

    • 在未提交读级别下,读取数据不需要加共享锁
    • 在提交读级别下,读操作需要加共享锁,但是在语句执行完以后释放共享锁
    • 在重复读级别下, 读操作需要加共享锁,但是在事务提交之前并不释放共享锁,也就是必须等待事务执行完毕以后才释放共享锁
    • 在可串行化下,该级别锁定整个范围的键,并一直持有锁,直到事务完成

    3.按照锁的粒度分数据库锁有哪些

    在关系型数据库中,可以按照锁的粒度把数据库锁分为行级锁、表级锁和页级锁,这三种锁是根据锁的粒度来区分的,行记录、表、页都是资源,锁是作用在这些资源上的,如果粒度比较小,可以增加系统的并发量,但是需要比较大的系统开销,会影响到性能,出现死锁

    • 行级锁:行级锁是MySQL中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但加锁的开销也最大
    • 表级锁:表级锁是MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加锁
    • 页级锁:页级锁是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁

    MyISAM和InnoDB存储引擎使用的锁:

    • MyISAM采用表级锁
    • InnoDB采用行级锁和表级锁,默认为行级锁

    4.从锁的类别上分MySQL都有哪些行级锁

    从锁的类别上来讲,有共享锁和排他锁:

    • 共享锁:又叫读锁,当用户要进行数据的读取时,对数据加上共享锁。共享锁可以同时加上多个
    • 排他锁:又叫做写锁。当用户要进行数据的写入时,对数据加上排他锁。排他锁只有一个,他和其他的排他锁、共享锁都相斥

    这里存在一个误区:以为排他锁锁住一行数据后,其他事务就不能再读取和修改该行数据。但其实不是这样的,排他锁指的是一个事务在一行数据加上排他锁后,其他事务不能再在其上加其他的锁。
    在InnoDB引擎中,默认的修改数据语句(update、insert、delete)都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁的类型,

    • 加排他锁:select……for update
    • 加共享锁:select……lock in share mode

    总的来说:排他锁是指在给某行数据加上排他锁之后,其他事务不能再给该行数据加任何的排他锁和共享锁,但如果某条语句只是进行查询,但是不给该行加任何锁,那么该语句也是可以查询到该行数据的

    5.意向锁

    数据库中的数据存放是分级的,类似于表——页——记录这样的存储
    在这里插入图片描述
    现在举个例子:
    事务A锁住了表中的一行,让这一行只能读,不能写。之后,事务B申请整个表的写锁,如果事务B申请成功,那么它将获得修改整个表的权限,这样和事务A是有冲突的,那么怎么解决这个冲突呢

    在没有意向锁的情况下:

    • 判断表是否一被其他事务用表锁锁住
    • 判断表中的每一行是否已被其他行锁锁住

    在步骤二中,共享锁和排他锁都是行级锁,也就是说每次事务都必须遍历整个表,才知道是否可以获取该行上的锁,效率太低,所以为了减少这样的查询,所以MySQL支持多粒度锁定
    MySQL支持多粒度锁定,也就是说允许行级锁和表级锁同时存在,而为了支持这种多粒度锁定,引入了意向锁

    当有了意向锁之后,那么上面的例子又会变成什么样的:

    • 判断表是否已被其他事务用表锁锁住
    • 发现表上有意向共享锁,说明表中有些行被共享行锁锁住了,因此,事务B申请表的写锁会被阻塞

    意向锁分类:

    • 意向共享锁(IS):事务想要获取一张表中的某几行的共享锁
    • 意向排他锁(IX):事务想要获得一张表中的某几行的排他锁

    意向锁概述:

    • 意向锁是一种表锁,分为IS和IX两种意向锁
    • 意向锁是将锁定的对象分为多个层次,意味着事务希望在更细粒度上进行加锁

    6.MySQL中的InnoDB行锁的实现方式

    InnoDB行锁是通过给索引上的索引项加锁来实现的,InnoDB这种行锁实现特点以为着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁,也就没有所谓的并发(因为InnoDB将整张表都锁定了)

    7.InnoDB有三种行锁的算法:

    1. Record Lock:单个行记录上的锁
    2. Gap Lock:间隙锁,锁定一个范围,但不包括记录本身。GAP锁的目的,是为了防止同一事务的两次当前读,出现幻读的情况
    3. Next-Key Lock:锁定一个范围,并且锁定记录本身。对于行的查询,但是采用该方法,主要目的是解决幻读的问题

    8.什么是死锁

    死锁是指两个或多个事务在统一资源上相互占用,并请求锁定对方的资源,从而导致恶性循环的现象

    常见的解决死锁的办法:

    1. 如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低死锁机会
    2. 在同一事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率
    3. 对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁来减少产生死锁产生概率

    9.数据库的乐观锁和悲观锁是什么

    数据库管理系统中的并发控制的任务是确保在多个事务同时存取数据库中统一数据时不破坏事物的隔离性和统一性

    9.1悲观锁

    悲观锁的特点就是先获取锁,再进行业务操作,“悲观”就是认为获取锁是非常可能失败的,因此要先确保获取锁成功再进行业务操作,通常来讲,在数据库上的悲观锁需要数据库本身提供支持,即通过常用的select…… for update操作来实现悲观锁。悲观锁的实现方式:使用数据库中的锁机制

    9.2乐观锁

    假设不会发生并发冲突,只是在提交操作时检查是否违反数据完整性。在修改数据的时候把数据锁起来

    展开全文
  • MySQL数据库面试题(2020最新版)

    万次阅读 多人点赞 2020-03-10 17:20:40
    数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4...
  • 面试题MySQL锁机制

    千次阅读 2020-09-21 16:51:38
    MySQL锁机制 通常有 行锁 行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但加锁的开销也最大。有可能会出现死锁的情况。 ...
  • https://www.cnblogs.com/aipiaoborensheng/p/5767459.html https://segmentfault.com/a/1190000014133576
  • MySql锁机制

    千次阅读 2020-02-05 20:44:32
    MYSQL共有几种锁机制? 两种 共享锁(读锁):其他事务可以读,但不可以写 排它锁(写锁):其他事务不可以读也不可以写 MYSQL按锁粒度共分几种,有什么特点? 由小到大分三种 行锁:开销大,加锁慢;会出现死锁;锁定粒度...
  • mysql面试题

    2021-03-16 18:29:34
    - 简书2018最新mysql数据库优化面试 mysql索引面试 MySQL搜索引擎面试 MySQL面试基础知识 - 简书MySQL 有哪些存储引擎啊?都有什么区别?Float、Decimal 存储金额的区别?浮点数计算都不准(只要不是2的整数倍都会有...
  • MySQL面试题及答案 【最新版】MySQL面试题大全,发现网上很多MySQL面试题及答案整理都没有答案,所以花了很长时间搜集,本套MySQL面试题大全 如果不背 MySQL面试题的答案,肯定面试会挂! 这套MySQL面试题大全,...
  • Mysql面试题(100+)

    千次阅读 2022-06-27 06:07:42
    1、MySQL索引使用有哪些注意事项呢?2、MySQL遇到过死锁问题吗,你是如何解决的?3、日常工作中你是怎么优化SQL的? 4、说说分库与分表的设计 5、InnoDB与MyISAM的区别 6、数据库索引的原理,为什么要用B+树,为什么...
  • Mysql经典面试题汇总

    千次阅读 2020-07-13 21:16:38
    1. ACID是什么?...其中原子性是基于 Redo/undo log机制来实现的, Redolog记录的是事务更新后的记录值,undo log记录的是事务更新后的记录,更新失败后,就可以根据undo log来进行回滚。 ............
  • 个人在面试中被问到以及收集网上的高频Mysql面试题,希望可以帮助到备战求职的同学。
  • MySQL面试题以及答案整理【最新版】MySQL高级面试题大全(2021版),发现网上很多MySQL面试题都没有答案,所以花了很长时间搜集,本套MySQL面试题大全,汇总了大量经典的MySQL程序员面试题以及答案,包含MySQL语言常见...
  • MySQL面试题大全(陆续更新)

    万次阅读 多人点赞 2022-03-25 16:22:06
    5.2 事务的四种特性是基于什么机制实现的 事务的隔离性是由锁机制实现的 事务的原子性、一致性由undo log实现 事务的持久性由redo log实现 5.3 InnoDB支持的四种事务隔离级别 读未提交:可避免脏写,无法避免脏...
  • JAVA mysql 常用面试题

    千次阅读 2021-08-19 17:49:18
    一、mysql有哪几种 ...3.页级:页级mysql中比较折中的一种,行级开销大,冲突少,表级开销小,冲突大,页级就是比较折中的一种,他能够对数据行相邻的一组数据进行加锁 按级别划分 4.共享
  • MySQL 精选 60 道面试题(含答案)

    千次阅读 2022-03-19 00:39:17
    金三银四到了,给大家整理一些数据库必知必会的面试题。基础相关1、关系型和非关系型数据库的区别?关系型数据库的优点容易理解,因为它采用了关系模型来组织数据。可以保持数据的一致性。数据更新的开...
  • MySQL常见面试题汇总(建议收藏!!!)

    万次阅读 多人点赞 2021-08-08 15:09:02
    目录一、索引相关(1)什么是索引?...(6)MySQL中有四种索引类型,可以简单说说吗?(6)覆盖索引是什么?(6)联合索引是什么?为什么需要注意联合索引中的顺序?(6)创建的索引有没有被使用到?或者说怎
  • MySQl面试题

    千次阅读 2022-02-04 11:50:16
    MySQL 面试题 事务的四大特征数据库的三大范式第一范式1NF第二范式2NF第三范式3NF2NF和3NF的区别事务隔离级别有哪些?索引什么是索引索引的优缺点索引的作用什么情况下需要创建索引什么情况下不建索引?索引的数据...
  • MySQL数据库面试题(2022最新版)

    千次阅读 2022-07-12 08:36:11
    优点:存取速度快缺点:数据不能永久保存优点:数据永久保存缺点:1)速度比内存操作慢,频繁的IO操作。2)查询数据不方便1)数据永久保存2...MySQL是最流行的关系型数据库管理系统之一,在WEB应用方面,MySQL是最好的
  • 常见(MySQL面试题(含答案)

    千次阅读 多人点赞 2022-07-28 17:00:24
    常见(MySQL面试题(含答案) 本文的面试题如下: MyisAM和innodb的有关索引的疑问 innodb为什么要用自增id作为主键 MySql索引是如何实现的 说说分库与分表设计(面试过) 聚集索引与非聚集索引的区别 事务四大...
  • 100道MySQL面试题及答案

    万次阅读 多人点赞 2022-04-02 22:15:56
    1. MySQL 索引使用有哪些注意事项呢? 可以从三个维度回答这个问题:索引哪些情况会失效,索引不适合哪些场景,索引规则 索引哪些情况会失效 查询条件包含or,可能导致索引失效 如何字段类型是字符串,...
  • MySQL数据库面试题(2022版)

    千次阅读 2022-04-26 14:34:57
    Java基础知识面试题(2022版) https://blog.csdn.net/qq_43061290/article/details/124023797 2 Java集合容器面试题(2022版) https://blog.csdn.net/qq_43061290/article/details/124043363 3 Java异常面试题...
  • mysql数据库面试题大全(持续更新)

    千次阅读 2021-11-30 10:41:37
    mysql数据库面试题大全第03章 数据库项目经理(作者):张明星基础SQL语言共分为四大类数据查询语言DQL数据操纵语言DML数据定义语言DDL数据控制语言DCLwhere、jion、limit、group by、having等执行先后顺序?...
  • MySQL数据库面试题总结(2022最新版)

    万次阅读 多人点赞 2022-02-13 16:30:17
    MySQL 数据库面试题(2022版) 文章目录一、基础基本概念MySQL有哪些数据库类型?CHAR 和 VARCHAR 区别?数据库设计什么是三大范式?什么是范式和反范式,以及各自优缺点?二、索引索引的几种类型或分类?索引的优...
  • 前言 100道MySQL数据库经典面试题解析,已经上传gith...
  • 目录1、MySQL 中有哪几种?2、MySQL 中有哪些不同的表格?3、简述在MySQL 数据库中 MyISAM 和InnoDB 的区别4、MySQL 中InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别?5、CHAR 和VARCHAR 的区别?6、...
  • MySQL高频面试题(最新版)

    千次阅读 多人点赞 2021-01-21 20:33:33
    MySQL高频面试题,题目后面的星数越高,在面试中越高频 推荐阅读: 计算机网络高频面试题(最新版) Java集合高频面试题(最新版) Java基础知识高频面试题(最新版) 文章目录什么是MySQL? *MySQL常用的存储...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 33,125
精华内容 13,250
热门标签
关键字:

mysql锁机制面试题

mysql 订阅
友情链接: readText.rar