MySQL锁机制

  1. 共享锁(读锁):

共享锁(S 锁)允许并发事务在封闭式并发控制下读取 (SELECT)资源。资源上存在共享锁(S锁)时,任何其他事务都不能修改数据。读取操作一完成,就立即释放资源上的共享锁(S锁),除非将事务隔离级别设置为可重复读或更高级别,或者在事务持续时间内用锁定提示保留共享锁(S锁)。

 

  1. 共享锁在MySQL中的实现,

A,通过在执行语句后面加上lock in share mode就代表对某些资源加上锁呢,

先开启一个数据库执行窗口,设置为手动提交,在执行select * from test_mysql where id=1 lock in share mode;表示表示加入共享锁;

B,开启另一个窗口,执行select * from test_mysql where id=1;会查询到结果,

但是执行更新操作,会出现延迟,直到第一个事务提交成功后,更新才会执行成功;

 

 

  1. 排它锁(写锁):

排他锁(X 锁)可以防止并发事务对资源进行访问。排他锁不与其他任何锁兼容。使用排他锁(X锁)时,任何其他事务都无法修改数据;仅在使用 NOLOCK提示或未提交读隔离级别时才会进行读取操作。(执行insert,update,delete操作时,会自动加上排它锁)

  1. 更新锁(U):-- 更新锁可以防止常见的死锁。

更新锁在共享锁和排他锁的杂交。更新锁意味着在做一个更新时,一个共享锁在扫描完成符合条件的数据后可能会转化成排他锁。

  1. 行锁: SELECT * from test_mysql where id = "1"  lock in share mode;

由于对于city表中,id字段为主键,就也相当于索引。执行加锁时,会将id这个索引为1的记录加上锁,那么这个锁就是行锁

  1. 表锁:与行锁相对应,当执行语句的where条件中没有出现主键时,默认加表锁;

,乐观锁和悲观锁;

  1. 悲观锁:每次获取数据的时候,都会担心数据被修改,所以在获取数据的时候会对数据加锁, 确保自己在使用过程中,数据不会被别人修改,使用完成后进行解锁;用于数据加锁,期间对该数据进行读写的其他线程需要等待;(共享锁和排它锁都属于悲观锁的范畴,悲观锁一般数据库都默认实现)
  2. 乐观锁:每次获取数据的时候,都不会担心数据被修改,所以每次获取数据的时候都不会对           数据加锁,但是在更新该数据的时候需要判断该数据是否被别人修改过,如果数据被别人修改过,则不进行数据更新,如果数据没有被别人修改过,则进行数据更新;期间,由于数据没有加锁,所以可以被其他线程进行读写操作;
  3. 使用场景:
  1. 悲观锁:比较适合写入操作比较频繁的场景,如果出现大量的读取操作,每次读取的时候会进行加锁,这样会增加大量的开销,降低了系统的吞吐量;
  2. 乐观锁:比较适合读取操作比较频繁的场景,如果出现大量的写入操作,数据发生冲突的可能性就会增大,为了保证数据的一致性,应用层需要不断的重新获取数据,这样会增加大量的查询操作,降低了系统的吞吐量

 

乐观锁的实现:在表中的数据进行操作时(更新),先给数据表加一个版本(version)字段,每操作一次,将那条记录的version字段加1,也就是先查询出那条记录,获取version字段,如果要对那条记录进行操作(更新)则判断此刻version的值是否与刚刚查询出来时的version的值相等,如果相等,则说明这段期间,没有其他程序对其进行操作,则可以执行更新,version的值加1,反之,不能进行更新操作;

                 

举例:下单操作3步骤:

  1. 查询出商品信息:

Select (status,categoey,version) fron t_goods where id=#{id};

  1. 更具商品信息生成订单
  2. 修改商品status2

update t_goods set status =2,version=version+1 where id=#{id} and version=#{version};

总结:读取频繁使用乐观锁,写入频繁使用悲观锁

<think>好的,用户想了解MySQL锁机制及其工作原理。我需要根据提供的引用内容来组织回答。首先,引用1提到锁机制是保证数据一致性和并发性的重要部分,所以应该先介绍锁的基本作用。然后,引用4提到了表级锁和行级锁的区别,需要分点说明这两种锁的粒度、冲突概率和适用场景。 接下来,引用2指出行级锁实际上是锁索引,而不是直接锁记录,这一点很重要,需要详细解释,尤其是在InnoDB引擎下的不同索引情况下的锁行为。另外,引用3提到合理使用锁和事务管理可以避免数据冲突,所以在应用场景部分需要结合事务隔离级别来说明不同锁的使用情况。 还需要注意用户可能对锁的类型不太清楚,所以应该分类介绍共享锁和排他锁,并给出对应的SQL示例,比如SELECT ... LOCK IN SHARE MODE和SELECT ... FOR UPDATE。同时,要提到意向锁的概念,作为表级锁和行级锁之间的协调机制,这里可能需要解释意向锁的作用,避免冲突。 关于死锁,用户可能想知道如何处理,需要说明MySQL的自动检测和回滚机制,以及如何设置超时参数。编程示例部分,可以举一个事务中使用行级锁的例子,比如更新订单状态时锁定相关记录,确保数据的一致性。 最后,生成相关问题时要覆盖锁的类型、行锁与索引的关系、死锁处理、应用场景对比以及事务隔离级别的影响。需要确保所有引用内容都正确标注来源,并且语言通俗易懂,结构清晰。</think>### MySQL锁机制详解 MySQL锁机制是数据库管理系统实现并发控制的核心技术,主要用于协调多个事务对共享资源的访问。其核心目标是在保证数据一致性的前提下,尽可能提高并发性能。以下是锁机制的核心要点: --- #### 一、锁的类型与层级 1. **表级锁** - **锁定粒度**:直接锁定整个表 - **冲突概率**:高(多个事务操作同一表的概率大) - **适用场景**:MyISAM引擎默认使用表级锁,适用于读多写少的场景[^4] - **示例语句**:`LOCK TABLES table_name READ/WRITE;` 2. **行级锁** - **锁定粒度**:仅锁定索引对应的行(注意:行锁通过索引实现,若未命中索引会退化为表锁)[^2] - **冲突概率**:低(仅锁定特定行) - **适用场景**:InnoDB引擎支持,适合高并发写入操作 - **示例语句**:`SELECT * FROM table WHERE id = 1 FOR UPDATE;` 3. **页级锁** - **锁定粒度**:介于表级和行级之间(锁定数据页) - **适用引擎**:BDB存储引擎 --- #### 二、锁的访问模式 1. **共享锁(S Lock)** - **作用**:允许事务读取数据,阻止其他事务获取排他锁 - **语法**:`SELECT ... LOCK IN SHARE MODE;` - **示例**:事务A持有共享锁时,事务B可读但不可写。 2. **排他锁(X Lock)** - **作用**:允许事务修改数据,阻止其他事务获取任何锁 - **语法**:`SELECT ... FOR UPDATE;` - **示例**:事务A更新某行时,其他事务无法读写该行。 3. **意向锁(Intention Locks)** - **作用**:表级锁,用于快速判断表中是否存在行级锁 - **类型**:意向共享锁(IS)、意向排他锁(IX) - **示例**:事务A对某行加共享锁前,需先获取表的IS锁。 --- #### 三、锁的实现细节 1. **行锁与索引的关系** - 当使用唯一索引时,仅锁定符合条件的行。 - 若未使用索引或索引失效,InnoDB会升级为表锁。 - **示例**:执行`UPDATE users SET name='Bob' WHERE age=30`,若`age`字段无索引,将锁定整个表。 2. **死锁处理** - MySQL自动检测死锁,并回滚代价较小的事务。 - **编程建议**:设置合理的锁超时时间(`innodb_lock_wait_timeout`)和重试机制。 --- #### 四、应用场景与编程示例 ```sql -- 事务中使用行级锁(InnoDB引擎) START TRANSACTION; SELECT * FROM orders WHERE order_id = 100 FOR UPDATE; -- 获取排他锁 UPDATE orders SET status = 'shipped' WHERE order_id = 100; COMMIT; ``` **说明**:通过`FOR UPDATE`锁定订单记录,确保在更新状态时其他事务无法修改该订单[^3]。 --- #### 五、锁机制与事务隔离级别 - **读未提交(Read Uncommitted)**:无锁控制,可能脏读。 - **读已提交(Read Committed)**:通过行级锁避免脏读。 - **可重复读(Repeatable Read)**:默认隔离级别,通过间隙锁(Gap Lock)防止幻读。 - **串行化(Serializable)**:强制所有操作加锁,牺牲并发性。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值