问题详情
介绍一下互斥锁和悲观锁的具体区别?
互斥锁(Mutex)是一种互斥量,用于保护共享资源,确保同一时间只有一个线程可以访问它。当一个线程使用互斥锁时,它会尝试获得锁,如果锁已经被其他线程持有,该线程就会被阻塞,直到锁被释放。互斥锁是一种悲观锁。
悲观锁(Pessimistic Lock)是一种锁机制,它认为并发访问会产生冲突,因此在整个操作过程中都会加锁。当一个线程使用悲观锁时,它会在每次访问共享资源之前先加锁,防止其他线程同时访问资源。悲观锁适用于多写少读的场景,因为每次读操作都需要加锁,会影响性能。
总之,互斥锁是一种保护共享资源的措施,它会阻止多个线程竞争同一个资源,避免数据的不一致。而悲观锁则是一种保守的措施,它认为并发访问会产生冲突,因此在整个操作过程中都会加锁,以确保数据的一致性。
-
上一篇
介绍一下互斥锁和悲观锁的具体区别?
<p>一、<strong>基本概念</strong></p><p>MySQL 中的锁分为表锁和行锁,表锁是把整张表锁住,行锁粒度小一点,对行进行加锁。同时,行锁是针对索引列,当数据走索引时才会有行锁。一张表即使你没有创建主键索引,MySQL 会创建一个隐藏的主键索引列。</p><p><br></p><p>二、<strong>行锁</strong></p><p>1.<strong>共享锁(</strong>Shared Locks<strong>)</strong>:共享锁又叫读锁(简称<span style="color: rgb(154, 188, 82);">S锁</span>),共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。共享锁加锁方式:select * from student where id=1 <strong style="color: rgb(154, 188, 82);">LOCK IN SHARE MODE</strong></p><p>2.<strong>排他锁(</strong>Exclusive Locks<strong>)</strong>:排他锁又叫写锁(简称<span style="color: rgb(247, 117, 103);">X锁</span>),排他锁不能与其他锁并存,如果一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的锁(共享锁、排他锁),只有该获取了排他锁的事务是可以对数据行进行读取和修改。排他锁加锁方式有两种,一种是执行 delete / update / insert 默认加上X锁。另一种方式是:select * from student where id=1 <strong style="color: rgb(247, 117, 103);">FOR UPDATE</strong></p><p><br></p><p>三、<strong>表锁</strong></p><p><strong>意向锁</strong>:意向锁分为意向共享锁(IS)intention shared lock和意向排他锁(IX)intention exclusive lock。意向锁 是 InnoDB 引擎操作数据之前自动加的,不需要用户干预。当事务想去进行锁表时,可以先判断意向锁是否存在,存在时则可快速返回该表不能启用表锁。</p><p><br></p><p>三、<strong>InnoDB行锁实现的三种算法</strong></p><p>间隙锁(Gap Locks)、临键锁(Next-key Locks)、记录锁(Record Locks)</p><p><br></p><p>四、总结</p><p>1.InnoDB 行锁到底锁住了什么?InnoDB 的行锁是通过给索引上的索引项加锁来实现的,通过索引进行数据检索,InnoDB 才使用行级锁,否则 InnoDB 将使用表锁,即锁住整个表的所有记录。</p><p>2.插入、删除和修改加的锁类型都是排他锁,删除和修改加的是 next-key 的排他锁,插入是在索引上加一个记录排他锁。当插入发生a duplicate-key error,会设置一个共享锁。</p><p>3.行锁是作用在索引上,如果一个表没有索引和主键,mysql会创建一个隐藏的主键列;</p><p>4.在可重复读级别才有间隙锁和next-key-lock</p><p>5.事务一提交,锁就会释放</p><p>6.如果加锁匹配不上任何索引,会对整个表加锁</p><p>7.加锁的基本单位为 next-key-lock,除了Insert操作</p>
-
下一篇
介绍一下互斥锁和悲观锁的具体区别?
介绍一下互斥锁和悲观锁的具体区别?
相关文章
- 请解释下PHP中会话(session)和Cookie(cookie)的作用。
- 请解释什么是defer语句,以及它有什么作用?
- 聊一下高并发和高性能的区别和联系?
- 请提供至少三个通过PHP实现的网站性能优化技巧。
- 请举例说明PHP中如何处理异常?
- 请问PHP中如何实现多线程?
- 请描述在Golang中使用MongoDB时的最佳实践。
- 请解释HTTP的基本概念,以及在Golang中如何使用HTTP?
- 如何在Golang中进行并发编程?
- 请给一个例子解释一下PHP中的闭包函数是什么?
- 请解释一下PHP中的MVC模式是如何工作的?
- 请谈谈您对PHP的垃圾回收机制的了解及实践。
- PHP7和PHP5的性能上有什么差别?
- 如何通过PHP来保护您的代码免受SQL注入攻击?
- PHP中常用的设计模式有哪些?
- PHP中如何进行单元测试以及如何在开发过程中保证代码质量?
- 如何在Golang中实现单例模式?
- 在PHP中,Magic Method都有哪些,并举例说明它们的作用?
- PHP中如何处理文件上传和下载?
- 请列出与PHP相关的缓存机制及其优缺点。
微信收款码
支付宝收款码