数据库 锁 蔚落 2023-03-03 04:55 11阅读 0赞 > 解决脏读,不可重复读,幻读,可以有两种方案: > 1.读操作用MVCC,写操作用加锁 > 2. 读,写都用加锁 共享锁 S锁 独立锁 X锁 行锁 表锁 S锁 X锁 IS意向共享锁 IX意向独占锁 ## MySQL中的行锁和表锁 ## > MySQL支持多种存储引擎,不同存储引擎对锁的支持也是不一样的 ### 其他存储引擎中的锁 ### > MyISAM、MEMORY、MERGE这些存储引擎只支持表级锁,这些引擎并不支持事务,所以使用这些存储引擎的锁一般都是针对当前会话 ### InnoDB存储引擎中的锁 ### > InnoDB存储引擎既支持表锁,也支持行锁。 > 表锁实现简单,占用资源较少,粒度很粗,相当于为表中的所有记录都加锁,所以性能比较差。 > 行锁粒度更细,可以实现更精准的并发控制 #### 表级别的锁 #### 1. 表级别的S锁、X锁 > 对某个表执行SELECT、INSERT、DELETE、UPDATE语句时,InnoDB存储引擎是不会为这个表添加表级别的S锁或者X锁的。 > 在对某个表执行一些诸如ALTER TABLE、DROP TABLE这类的DDL语句时,其他事务对这个表并发执行诸如SELECT、INSERT、DELETE、UPDATE的语句会发生阻塞,反之同理,这个过程其实是通过在server层使用一种称之为元数据锁(英文名:Metadata Locks,简称MDL)实现的,一般情况下也不会使用InnoDB存储引擎自己提供的表级别的S锁和X锁。 > InnoDB存储引擎提供的表级S锁或者X锁是相当鸡肋,只会在一些特殊情况下,比方说崩溃恢复过程中用到。表锁的粒度太粗,会降低并发性能。 1. 表级别的IS锁、IX锁 > 在对使用InnoDB存储引擎的表的某些记录加S锁之前,那就需要先在表级别加一个IS锁, > 在对使用InnoDB存储引擎的表的某些记录加X锁之前,那就需要先在表级别加一个IX锁。 > IS锁和IX锁的作用是为了后续在加表级别的S锁和X锁时判断表中是否有已经被加锁的记录,以避免用遍历的方式来查看表中有没有上锁的记录。 1. 表级别的AUTO-INC锁 实现自动给AUTO\_INCREMENT修饰的列递增赋值的原理主要是两个: 1)AUTO-INC锁,在执行插入语句时就在表级别加一个AUTO-INC锁,为每条待插入记录的AUTO\_INCREMENT修饰的列分配递增的值,一个事务在持有AUTO-INC锁的过程中,其他事务的插入语句都要被阻塞,可以保证一个语句中分配的递增值是连续的。 2)采用一个轻量级的锁,在为插入语句生成AUTO\_INCREMENT修饰的列的值时获取一下这个轻量级锁,然后生成本次插入语句需要用到的AUTO\_INCREMENT列的值之后,就把该轻量级锁释放掉,并不需要等到整个插入语句执行完才释放锁。 > innodb\_autoinc\_lock\_mode系统变量可以控制使用上述两种方式中的哪种来为AUTO\_INCREMENT修饰的列进行赋值, > 当innodb\_autoinc\_lock\_mode值为0时,一律采用AUTO-INC锁; > 当innodb\_autoinc\_lock\_mode值为2时,一律采用轻量级锁; 可能会造成不同事务中的插入语句为AUTO\_INCREMENT修饰的列生成的值是交叉的,在有主从复制的场景中是不安全的。 > 当innodb\_autoinc\_lock\_mode值为1时,两种方式混着来(也就是在插入记录数量确定时采用轻量级锁,不确定时使用AUTO-INC锁)。 #### 行级别的S锁,X锁 #### 1. Record Locks:S锁,X锁 【LOCK\_REC\_NOT\_GAP】 2. Gap Locks:【LOCK\_GAP】 为了防止插入幻影记录而提出的 3. Next-Key Locks:【LOCK\_ORDINARY】 本质就是一个正经记录锁和一个gap锁的合体,它既能保护该条记录,又能阻止别的事务将新记录插入被保护记录前边的间隙。 4. Insert Intention Locks:【LOCK\_INSERT\_INTENTION】 插入意向锁并不会阻止别的事务继续获取该记录上任何类型的锁 5. 隐式锁 一个事务对新插入的记录可以不显式的加锁(生成一个锁结构),但是由于事务id这个牛逼的东东的存在,相当于加了一个隐式锁。别的事务在对这条记录加S锁或者X锁时,由于隐式锁的存在,会先帮助当前事务生成一个锁结构,然后自己再生成一个锁结构后进入等待状态。 ### InnoDB锁的内存结构 ### > 对一条记录加锁的本质就是在内存中创建一个锁结构与之关联 > ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW5nbWlubHU_size_16_color_FFFFFF_t_70] [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW5nbWlubHU_size_16_color_FFFFFF_t_70]: /images/20230208/298a2602b5624020b71f477563cd1349.png
相关 数据库 锁 > 解决脏读,不可重复读,幻读,可以有两种方案: > 1.读操作用MVCC,写操作用加锁 > 2. 读,写都用加锁 共享锁 S锁 独立锁 X锁 行锁 表锁 蔚落/ 2023年03月03日 04:55/ 0 赞/ 12 阅读
相关 数据库锁 我们在操作数据库的时候,可能会由于并发问题而引起的数据的不一致性(数据冲突)。如何保证数据并发访问的一致性、有效性,是所有数据库必须解决的一个问题,锁的冲突也是影响数据库并发访 港控/mmm°/ 2022年10月01日 12:48/ 0 赞/ 134 阅读
相关 数据库锁理论 一 行锁特点 偏向 InnoDB 存储引擎,开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率最低,并发度也高。 InnoDB 和 MyISAM的最大不同有两点: 小鱼儿/ 2022年09月12日 11:47/ 0 赞/ 121 阅读
相关 数据库锁机制 【引言】 数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据, 墨蓝/ 2022年08月19日 01:50/ 0 赞/ 206 阅读
相关 oracle数据库 锁表 解锁 1、根据表名查询锁定的会话 select p.spid, c.object\_name, b.session\_id,a.serial\,b.oracle\_usernam た 入场券/ 2022年06月16日 12:10/ 0 赞/ 273 阅读
相关 数据库锁机制 一、为什么要引入锁 多个用户同时对数据库进行并发操作时,会引起以下数据不一致的问题: 丢失更新:AB两个用户对同一数据进行修改,其中一个用户的修改结果破坏了另一个用户的修改 谁践踏了优雅/ 2022年06月07日 04:35/ 0 赞/ 253 阅读
相关 数据库死锁 问题说明 > 当多个用户并发地存取数据时,在[数据库][Link 1]中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库 朱雀/ 2022年05月09日 00:44/ 0 赞/ 272 阅读
相关 数据库乐观锁 表中留一列:版本号(int),时间戳 读取数据后,修改数据,更新时做版本比较,相同则更新并版本+1 不同放弃 SELECT use\_count, version F 古城微笑少年丶/ 2022年04月13日 13:55/ 0 赞/ 163 阅读
相关 数据库锁机制 锁定机制的优劣直接应想到一个数据库系统的并发处理能力和性能,所以锁定机制的实现也就成为了各种数据库的核心技术之一。本章将对MySQL中两种使用最为频繁的存储引擎MyISAM和I 短命女/ 2022年03月27日 05:45/ 0 赞/ 258 阅读
相关 数据库锁机制 1 前言 数据库大并发操作要考虑死锁和锁的性能问题。看到网上大多语焉不详(尤其更新锁),所以这里做个简明解释,为下面描述方便,这里用T1代表一个数据库执行请求,T2代表另 淡淡的烟草味﹌/ 2021年09月15日 05:28/ 0 赞/ 342 阅读
还没有评论,来说两句吧...