00:01
各位同学大家好,下面呢,我们继续来学习doc高并发编程,下面呢,咱们来讲解在doc里边的重要的一个概念,叫做读写所说起,读写所咱们先从啊,最基本的乐观所和悲观所说起。那各位同学来看一下,我这里边有两张图,这两张图是我提前画好的,这张图说的就是悲观锁,这张图讲到叫乐观所,那咱们首先先看一下悲观所是什么样一个特点,然后大家看这张图上。我这里划到,比如说我现在有一个账户,我账户里边呢,比如说目前有1万块钱,那这个时候呢,用悲观锁是怎么样一个过程呢?比如说现在第一个人对这个账户进行操作,他在操作的时候呢,对账户首先先上锁,他在上锁之后,那别人就不能在操作账户,别人只能是一个阻塞或者是一个等待状态。
01:08
当我这个人操作之后,他要做件事情就是这张图上。大家看到啊,这里边就是上锁,这个是不是就是解锁,或者说叫释放锁,等他操作之后把锁释放,那别人才能继续操作,那别人在操作的时候,他把账户首先是不是要上锁,他操作之后再进行解锁,就是每个人都进行上锁解锁,上锁解锁过程,这个过程就叫闭关锁。非关锁的好处是什么呢?能解决并发中的各种问题,它的缺点就是不支持并发操作,你只能一个人一个人进行操作,所以这是我们说的第一个特点,叫做悲关锁,这各位给他知道。而闭关锁一个最大缺点就是效率很低,因为它不支持并发操作,只能一个一个操作进行。
02:05
而下面呢,我们看第二个所,就是这张图上画的这个叫乐观所,而乐观锁什么特点呢?它是支持并发的,然后大家看,比如说我现在这个账户中有1万块钱,这个时候我两个人都可以得到账户中的数据进行操作,但是在操作的时候呢,乐观所有一个特点,它需要在你这个账户数据中加上一个叫version版本号,而每次每个人得到都是版本号,那这个时候呢,比如说我第一个人把账户减1000,第二个人减5000,最终两人中有一个人是不是要提交这个事物。比如说我现在啊,第一个人把事务提交了,他在提交之后,除了改账户值之外,还要做件事情,大家看这个事情。版本号之前是不是1.0啊?他在提之后把版本号改成了1.1,而他改成1.1之后有什么特点呢?我另外一个人在挑之前先做个比较,就这句话比较他当前数据版本号跟数据库中的版本号是否一致,但是发现他之前是1.0,数据库中已经变成了1.1,目前版本号是不一样的,所以最终他就会提交失败。
03:28
所以这就叫乐观锁,通过版本号进行控制,谁先提交,先改版本号,然后另外的人就不能进行提交,这是关于悲观所和乐观所两个最基本概念,各位把这个知道,你要知道悲观所是怎么做到的,乐观所的版本号是怎么进行处理的。悲观锁和乐观所说完之后,下面呢给各位再来说另外两个锁。一个锁叫做表锁,另外一个锁叫做行锁,那给大家解释一下什么叫表锁,什么叫行锁?比如说我现在要对数据库中的某一张表进行操作,而在表里边是不是有很多条记录?
04:15
假如说我现在这个表里边,比如说它有三条记录,这是第一条记录,然后这是第二条记录,这是它的第三条记录,那表锁什么意思呢?比如现在我对里边的第一条记录进行操作,他在操作的时候,那我就对整张表都上锁,就是我现在虽然我只操作一条记录,但是我整个表都上锁。别人就不能再操作这张表,这个就叫表锁。而什么叫行锁呢?这应该更好理解,比如我现在我只想操作里边的第一条记录,那我怎么做?我就对第一条记录上锁,那别人是不能操作第一条记录的,但是别人能操作第二条记录,第三条记录,包括其他记录,这就叫行锁。
05:06
所以这是两个基本的概念,而这两概念问各位这么一个问题啊,大家考虑一下,你说表锁和行锁谁会发生死锁?谁会发生?大家要注意啊,行锁是会发生四锁,表锁不会发生,因为表锁我锁的是整张表,我操作的时候整张表别人都不能操作了,所以它不会有死锁,但是行锁因为我只操作某一行,所以它会发生死锁。死锁什么特点?就是你多个线程互相等待,最终我等你,你等我,最终两人都不能往下进行,这个叫磁索,所以行锁会发生词索,这是两种状的锁,就是刚才咱们提到的乐观锁,悲观锁,包括表锁以里边这个行锁。这个位给他知道,然后这个说完之后,最后呢,引出咱们最终两概念,一个叫读索。
06:05
一个叫邪所,那我们来说一下啊,这两所特点,独所就是咱之前也提到毒索一般叫什么,它是不是叫。共享所,而写所叫什么?它叫做独占所,就是这个读所多人可以一起读,但是写只有一个人进行写,这是两种所,读所、共享所、写所叫独占所,那现在大家考虑这问题啊,你说独所和写所谁会发生词所?大家想一下,是堵索会有思索,还是邪索会发生思索?给大家强调啊,其实这两种情况,不管你是读所还是写索都会发生词索,是他们都会有这个词索的产生,那为什么会产生?下面给各位同学来解释一下,关于这个读索和写索是怎么发生词索的。
07:03
那我来说一下啊。比如说我现在有张表,表里边呢有它的这个记录,那这个时候比如说我现在我用读索进操作,而读索是不是叫共享锁呀,比如说我现在有两个人或者两个线程都来读取这个里边的这条记录,就都进行读取操作。啊,这个是一个读取,就是读取一,然后这个叫读取二,它们都可以读多条记录,当然各位注意啊,我这个线程在读的时候是不是也可以做一个修改操作,或者做一个就是其他操作是不是也可以进行,我一个线程可以做多个操作,既可以读又可以改,比如现在我这个线程一,就读取一的这个线程,他对一条记录做了一个读的操作,然后他在读的时候呢,对记录还做了一个修改操作,是不是可以进行。当然各位注意啊,它在修改的时候,因为我这个线程二对它是不是正在读啊,而这个时候我改肯定改不了,什么时候才能改,当我线程二读完之后是不是才能改,所以我这个修改要等线程二读完之后再进行,那这个时候呢,比如说恰巧我线程二对记录也做了一个修改操作,这时候产生了问题,我线程二的修改操作是不是要等到线程一读完之后才能进行改,所以它们之间就互相等待了,一的改再等二的读完成,二的改再等一的读完成之后进行,所以他们目前就是互相等待了,所以大家记住读索是会发生思索的。
08:48
一的线程在读的时候可以改,二的线程在读也可以改,一的改要等二的读完成才能改,二的这个修改要等一的线程读完之后才能修改,所以他们之间互相等待了,这个时候会发生死锁的这么一个问题给大家写一下。
09:09
一的线程修改的时候,它需要。等待二的线读之后才能进行,这是里边的第一个等待,而这个时候二的线程它修改的时候需要等待一的线程读之后才能进行,所以他们目前就是互相等待了,最终造成了思索的这么一个问题。所以各位把这个知道就是。毒所为什么会发生自锁,这是给各位说明了这么一个过程,这个我们就说完了,然后说完之后呢,下面呢,给大家再进一步说一下这个斜索是怎么发生思索的,那我在里边给各位进一步画一下,比如说我画到这个位置。
10:02
比如咱们现在啊,要做一个斜锁操作。因为各位知道写所又叫什么所,是不是叫独占锁呀?就是我读可以一起读,但是我写只能一个人来写,比如我现在同样有两个线程。比如现在啊,我的线程一,这是线程一,它对我的第一条记录做这么一个,就是比如一个写的或者一个修改的一个操作啊,或者说叫写的一个操作,那他进行了,他在操作的时候,别的线程是不能操作,只有等他进入之后才能操作,这是线程一做的事情,那这个时候,比如我的这个线程二,他对第二条记录做了一个写操作。这是线程二对这记录做了一个写操作,那这个时候线程二在操作这条记录的时候,别人是不是只能等待不能操作,当然各位注意啊,我线程一呢,在操作第一条记录的时候,是不是也可以去操作我的第二条记录就是它可以一个线路中操作多条记录。
11:09
那比如说现在线程一,他又去操作了我的第二条记录,这条记录他也进行这么一个操作。当然各位注意啊,我线程一在操作第二条记录的时候,因为第二条记录线程二是不是正在写操作,所以这个线程一这个操作是不是只能等待,比如说目前啊,碰巧了我这个线程二呢,也对第一条记录进行操作,那这个时候问题就出现了,我线程二在操作第一条记录的时候,因为第一条记录是不是正在被第一个线程写操作,所以它是不是也是等待,所以他们目前就是互相等待,最终造成了磁锁问题。第一个线程操作第一条记录,它也操作第二条记录,但是它遭到第二条记录要等线程二释放之后才能进行,而线程二在操作第一条记录时候,要等线程一释放之后才能操作,所以他们目前就是互相等待了,这样的话就发生了死索问题。所以这就关于读所和写所的特点,给各位最终重复一遍。
12:19
读索又叫共享索,会发生思索,写索又叫独撰索,也会发生思索,这个过程我在这里边给各位刚才都说到了,就是里边的这么一个流程,包括刚才提到那个乐观锁、非关锁、表锁和行锁,这些都是咱们最基本的集中锁,各位把这些特点都要给他牢牢记住。所以咱们把这个读写所的基本概念给各位就说完了。
我来说两句