#
再次复习MyISAM和InnoDB存储引擎时,发现两个存储引擎的区别包括MyISAM只支持表级锁,而InnoDB还支持行级锁,因为没有系统的了解过锁的概念,因此花了点时间进行了初步的学习,若有不对之处,望有指正;
#
简单回忆 MyISAM 与 InnoDB区别
-
MyISAM是5.5版之前,由于其缺陷明显,不支持外键和事务,崩溃后无法安全恢复,之后都使用InnoDB作为MySQL的默认存储引擎
-
两者具体区别包括:以下都是InnoDB支持,MyISAM不支持;
-
是否支持行级锁:
-
是否支持事务和崩溃后的安全恢复;
-
是否支持外键;
-
是否支持MVCC;
-
-
MyISAM就没有好处吗?MyISAM强调性能,每次查询具有原子性,其执行效率比InnoDB更快;但是一般情况下我们需要考虑扩展能力,并发能力,事务控制,更在乎稳定性,所以通常不会使用MyISAM;
-
进一步探讨行级锁与表级锁与页级锁的关系
-
首先了解锁的定义:
-
锁是用于控制并发访问的一种机制,它确保在多个并发事务同时访问或修改数据时,不会发送数据不一致或丢失更新等问题;
-
锁的特点:
-
确保数据的完整性;
-
提高隔离的级别;事务的隔离性通过锁定机制实现;
-
控制并发访问;控制并发对数据的访问和修改顺序;避免出现竞争条件和冲突操作。
-
同样也会影响性能:锁的引入会带来额外的开销,需要合适的策略和锁的粒度;
-
-
-
锁的粒度:决定了锁的范围和作用对象;
-
锁竞争:多个并发事务或线程对同一资源进行获取出现争抢锁定的情况;可能会导致死锁, 等待,降低性能;
-
性能降低:指频繁的锁竞争将性能浪费了,真正的业务处理并没有利用性能
-
-
-
行级锁与表级锁与页级锁 根据粒度的不同而分别定义
-
行级锁:
-
①粒度最小:对表的单行数据进行锁定;②只锁定受影响的行,不影响其他并发操作;③适合于需要精细控制并发访问的场景,但可能引起锁竞争
-
-
表级锁
-
①粒度最大:对整个表进行锁定;②阻止对整个表的操作;③并发性能下降;
-
-
页级锁
-
①粒度适中:介于行和表之间,以数据库页为单位(多行数据);②锁定多行,减小锁竞争;③平衡行级锁和表级锁的之间的场景
-
-
-
乐观锁与悲观锁
-
是两种不同的并发控制机制,用于处理多个事务同时访问共享数时可能出现的数据冲突情况
-
悲观锁:典型的悲观锁实现:行级锁和表级锁
-
悲观锁认为在并发情况下会频繁发生数据冲突,因此访问数据前先获取锁,并阻止其他事务对数据进行修改;
-
虽然适用于更新频繁,并发度较高的场景,但导致的问题就是死锁,性能下降等;
-
-
乐观锁:
-
乐观锁认为在并发情况下数据冲突的概率较低,因此允许多个事务同时访问数据,但提交时检查数据是否修改;
-
乐观锁实现通过版本控制或时间戳标记版本,在数据修改时通过比较版本号来判断是否冲突
-
版本号比对:读取数据时记录数据的版本号,修改时同时提交新的版本号,比较读取到的和数据库中的是否一致,不一致证明被修改过;
-
时间戳比对:读取数据时记录读取的时间戳,并标记最后修改时间,比较读取到的和数据库中的是否一致,不一致证明被修改过;
-
-
适用于读操频繁(查数据),写数据较少的场景,可以提高并发的性能,但是需要处理数据冲突的解释方案;
-
冲突解释方案
-
回滚事务;通过异常处理捕获冲突导致的异常提示用户重新操作;或者合并数据;
-
重试机制(深):
-
一种常见的错误处理和容错机制;
-
用于在发生错误或异常时重复执行某个操作,直到操作成功或达到最大重试次数;
-
在乐观锁中检测数据冲突时,可触发;或者当冲突导致更新失败,可触发
-
采用不同的重试策略:
-
固定间隔重试:见名识意
-
指数退避重试:每次重试间隔采用指数增长,避免过多重试给系统带来压力;
-
-
设置最大重试次数确保不会无限重试;达到最大重试次数返回异常信息给用户或将信息保留做为后续分析;
-
-
-
-
-
-