真香系列:java单例模式应用场景举例
作者:互联网
## 锁种类
Mysql中锁的分类按照不同类型的划分可以分成不同的锁,按照**「锁的粒度」**划分可以分成:**「表锁、页锁、行锁」**;按照**「使用的方式」**划分可以分为:**「共享锁」**和**「排它锁」**;按照思想的划分:**「乐观锁」**和**「悲观锁」**。
下面我们对着这几种划分的锁进行详细的解说和介绍,在了解设计者设计锁的概念的同时,也能深入的理解设计者的设计思想。
**「表锁」**是粒度最大的锁,开销小,加锁快,不会出现死锁,但是由于粒度太大,因此造成锁的冲突几率大,并发性能低。
Mysql中**「MyISAM储存引擎就支持表锁」**,MyISAM的表锁模式有两种:**「表共享读锁」**和**「表独占写锁」**。
当一个线程获取到MyISAM表的读锁的时候,会阻塞其他用户对该表的写操作,但是不会阻塞其它用户对该用户的读操作。
相反的,当一个线程获取到MyISAM表的写锁的时候,就会阻塞其它用户的读写操作对其它的线程具有排它性。
**「页锁」**的粒度是介于行锁和表锁之间的一种锁,因为页锁是在BDB中支持的一种锁机制,也很少没人提及和使用,所以这里制作概述,不做详解。
**「行锁」**是粒度最小的锁机制,行锁的加锁开销性能大,加锁慢,并且会出现死锁,但是行锁的锁冲突的几率低,并发性能高。
行锁是InnoDB默认的支持的锁机制,MyISAM不支持行锁,这个也是InnoDB和MyISAM的区别之一。
行锁在使用的方式上可以划分为:**「共享读锁(S锁)**「和」**排它写锁(X锁)」**。
当一个事务对Mysql中的一条数据行加上了S锁,当前事务不能修改该行数据只能执行度操作,其他事务只能对该行数据加S锁不能加X锁。
若是一个事务对一行数据加了X锁,该事物能够对该行数据执行读和写操作,其它事务不能对该行数据加任何的锁,既不能读也不能写。
**「悲观锁和乐观锁是在很多框架都存在的一种思想,不要狭义地认为它们是某一种框架的锁机制」**。
数据库管理系统中为了控制并发,保证在多个事务执行时的数据一致性以及事务的隔离性,使用悲观锁和乐观锁来解决并发场景下的问题。
Mysql中**「悲观锁的实现是基于Mysql自身的锁机制实现,而乐观锁需要程序员自己去实现的锁机制」**,最常见的乐观锁实现就锁机制是**「使用版本号实现」**。
乐观锁设计思想的在`CAS`的运用也是比较经典,之前我写过一篇关于CAS的文章,大家感兴趣的可以参考这一篇[]。
从上面的介绍中说了每一种锁的概念,但是很难说哪一种锁就是最好的,锁没有最好的,只有哪种业务场景最适合哪种锁,具体业务具体分析。
下面我们就具体基于Mysql的存储引擎详细的分析每一种锁在存储引擎中的运用和实现。
## MyISAM
MyISAM中默认支持的表级锁有两种:**「共享读锁」**和**「独占写锁」**。表级锁在MyISAM和InnoDB的存储引擎中都支持,但是InnoDB默认支持的是行锁。
Mysql中平时读写操作都是隐式的进行加锁和解锁操作,Mysql已经自动帮我们实现加锁和解锁操作了,若是想要测试锁机制,我们就要显示的自己控制锁机制。
Mysql中可以通过以下sql来显示的在事务中显式的进行加锁和解锁操作
### 总目录展示
该笔记共八个节点(由浅入深),分为三大模块。
**高性能**。 秒杀涉及大量的并发读和并发写,因此支持高并发访问这点非常关键。该笔记将从设计数据的动静分离方案、热点的发现与隔离、请求的削峰与分层过滤、服务端的极致优化这4个方面重点介绍。
**一致性**。 秒杀中商品减库存的实现方式同样关键。可想而知,有限数量的商品在同一时刻被很多倍的请求同时来减库存,减库存又分为“拍下减库存”“付款减库存”以及预扣等几种,在大并发更新的过程中都要保证数据的准确性,其难度可想而知。因此,将用一个节点来专门讲解如何设计秒杀减库存方案。
**高可用**。 虽然介绍了很多极致的优化思路,但现实中总难免出现一些我们考虑不到的情况,所以要保证系统的高可用和正确性,还要设计一个PlanB来兜底,以便在最坏情况发生时仍然能够从容应对。笔记的最后,将带你思考可以从哪些环节来设计兜底方案。
-----
篇幅有限,无法一个模块一个模块详细的展示(这些要点都收集在了这份《高并发秒杀顶级教程》里),觉得有需要的码友们,麻烦各位转发一下(可以帮助更多的人看到哟!)[点这里,即可获得免费下载的方式!!](https://docs.qq.com/doc/DSmxTbFJ1cmN1R2dB)
![](http://www.icode9.com/i/li/?n=2&i=images/20210706/1625572182857558.jpg)
![](http://www.icode9.com/i/li/?n=2&i=images/20210706/1625572183191171.jpg)
由于内容太多,这里只截取部分的内容。需要这份《高并发秒杀顶级教程》的小伙伴,麻烦各位帮忙点赞分享支持一下(可以帮助更多的人看到哟!)
标签:加锁,java,单例,真香,行锁,并发,MyISAM,Mysql,表锁 来源: https://blog.51cto.com/u_15292611/2994214