00:00
好来,下面我们再聊一个话题啊,就是这个文档的修改和这个并发的一个控制啊。其实这个翻译的简单一点啊,就是一个什么写的一个什么写并发对吧,你写并发操作在这个ES中,它怎么去处理的。OK吧,来看一下啊。呃。在这个ES中啊,他说全部的这个文档数据是不可不可以变的。哎,那我觉得不不太对呀,我之前不还改过吗。对吧,我之前不还改过吗?你为什么不可变呢?啊给大家说一下啊,它确实是不能变的,就是你的数据是不能够修改的,那他怎么做的呢?他怎么通过这个版本号的方式呢,去不断的做这个增加啊,他怎么不断去增加这个版本号。通过这种方式来去操作的。能理解吧,通过这种方式来去操作的啊,这个有有点类似,有点类似于那个h base那个效果。明白吧,哎,有点类似于那个效果啊,就是反正他并不是说这个不能真正的改,他也能改,他也能改啊,但是呢,他不是我们想象的那种改,就是直接找到数据,然后给你做一个更改,不是的,他什么通过这个版本号的方式来帮你去做这个维护的。
01:07
OK吧,那么这样做的目的主要是解决什么?更新过程中的一个什么并发冲突问题啊,更新过程中的一个什么并发冲突问题啊,来,我们一起来看一看。呃,假如说啊,你看这个就描述了一个这个更改的一个什么场景啊,比如说啊,我们有一个数字100。对吧,现在我有两个线程啊,我这两个线程的都需要什么对这个数字呢,去做一个简易的操作。都要做一个简易的操作,那你看了哈,假如说啊,我们两个线程的同时都读到了,诶你是100,你看他读到了100对吧,他也读到了100。能听懂,好,那接下来呢,我要同时做减一的操作,同时做减一的操作,比如说呢,他减了个一,那变成了99。对吧,他也减了个一,那变成了99,那最后呢,那你改完以后,你不得把这个数字给我写回去吗?来,他把99写回去了。是不是,那就得到结果是99,它呢又又得写过去,那他写过去以后呢,相当于这个数字要把之前的覆盖掉,那结果又是一个99,那这样的话就会发现我两个线程的同时对你这个数字做了修改,但是呢,其实最终的效果是什么呀,效果是不对的。
02:12
你正常应该变成98,但是你现在这个结果呢,还是一个99。拿好了吧,好,那这个问题怎么来的呢?这个问题就是因为你让他们两个人呢,同时都读到了这个100,就让他们各自认为你的数字就是100,我要什么在这个100的基础之上去做修改。但是你没有考虑到有没有可能在我读到100之后,有人把它已经改成了99,但是我还不知道这个事儿,我还是什么基于100多的修改。对吧,这个问题他是没有考虑到的。这个就是很典型的一个什么并发写的一个什么问题。对吧?并发血就可能会造成这种问题,好,那么如果有这种问题的话,我们应该怎么去控制这个事情,那就需要你好好去琢磨琢磨了。对吧,那我们现在这个目前,呃,就这个就是目前啊,我们对这种事情的这个解决方案的话,应该是有两两种啊,就两大种,哪两大种呢?啊,就是所谓的这个悲观的并发控制和这个乐观的一个并发控制,就这两种。
03:12
啊,这个先说这个悲观的吧,啊,这个什么叫做悲观的,这个并发控制呢。呃,这个你们应该之前都讲过啊,这个你可以理解为是悲观锁哈,这个是那个什么乐观锁。对吧,可能你这个没有听说过啊,那你可以怎么这么去选啊,就是这个悲观锁,悲观锁啊锁对不对,这就应该听过了吧,同学们这是什么,这是那个乐观锁啊是吧?啊,反正这样概念你应该是多多少少接触过的哈,来,那我们先说这个悲观锁啊。这个啥玩意叫悲观所啊,大家注意,那顾名思义,他就很悲观呗。对吧,就这个人呢,他很悲观啊,他的这个新的这个不是很开朗,对吧,很悲观啊,那悲观的情况下,就会导致他认为所有的事情呢,都是负面的啊,所有的事情都是负面的。
04:06
你能听懂吧,就比如说啊,放在这个数据修改里面,他就认为我再去对一个数据做修改操作的时候,就一定会有别的人跟我过来去抢这个事情。跟我跟我过来争,比如说哎,有另外一个请求。他要对这个数据呢,也要做改对吧,另外一个人也要对这个数据呢,做这个改的操作。他就会这么去认为。因为它是什么负面的。但实际情况呢,是不是这样子的呢?不一定,也有可能这两个人呢,他确实需要去看这个数据,对吧,但是呢,不对这个数据做更改,我只是想要去读一下这个数据。对吧,我就我就想看一看这个数据是多少,我就读一下就完事了,我不骤改,目前改的人只有你这一个,只有你在去改它。但是呢,他是负面的,他就认为人家过来就是想去改这个数据,但其实不是人家就是来过去过来读一下。但没办法,因为他很悲观,所以说他会怎么做呢?他就会把这个所有他可能认为有风险的事儿都给你啊。
05:08
拒之门外,怎么做的呢?就通过什么枷锁。就通过家属,就他在对这个数据做更改的时候注意啊,假如说他啊,他要去做更改的时候,那先对这个数据呢加把锁。能明白吧,加上锁以后,它就正常去做什么更改,比如说诶100,然后减一,减成一以后呢,99就存进去了,在这个过程中,别的线程还有可能做这个操作吗?我跟你讲不可能,你连读都读不到。你连他是100这个事你都读不到。这个过程根本是不可能有的,因为人家加了锁了,锁上了数据锁上了,锁上以后你就操作不了了,你就读不了了。明白吧,你只能等他,诶把这个整个的流程都走完以后,我走成99了,好,他会把那个锁释放掉,释放掉以后呢,其实这个地方就已经是99了,那你的另外一个线程过来的时候,不管你是读也好,还是改也好,你读到的一定是99,一定是他修改完以后的结果。
06:04
就不可能说同时出现两个人呢,都读到了100,然后呢,我们同时改,最后呢,有一个人把另外一个人什么结论给他什么覆盖掉了。对吧。这就是一个什么悲观的一个变化控制啊。这种锁呢,在这个数据库里面,就是我们这个关系数据库里面用的是比较广泛的。啊,比较广泛的啊,特别这个买sole啊,大家都听过什么行锁什么什么表锁对吧。就他为了确保这个数据的一个什么安全。那么他在去操作一行数据之前呢,先把它锁住。啊,确保什么只有获取锁了这个线程的才能什么对这个数据进行更改,其他的线程一概什么都做不了,你只要是对这个数据做操作,对不起,你就等着吧。等我把这个锁释放以后,你再去做这个操作,我是不允许我在做操作的时候有另外一个线程来去打扰我的这个事情不允许。因为我很悲观,我认为你们都是坏人。对吧。就算你只是过来去读一读,你不影响我的改操作,那也不行,万一你骗我呢?
07:05
对吧,因为我很悲观呀,我认为你们说的话都是假的。对吧,都想害我。是不是啊,这就是所谓的一种悲观并发控制,好吧,啊,这个大家应该都知道啊,我就简单聊一聊啊,行呃,还有一种这个解决方案呢,就是所谓的这个乐观的并发控制啊,那你看吧,那就很乐观了呀,对吧,心情很开朗。是啥叫很乐观呢?就他认为这个世界上都是好人啊,都是好人,就比如说我们拿数据修改来说啊,我在改这个数据的时候,对吧,别人呢,诶也有可能什么过来去读这个数据,也有可能过来改这个数据,但是呢,他会怎么认为呢?他认为不管你是过来读还是过来改,你都不会跟我做冲突的。啊,或者说呢,他认为我在做这个操作的时候呢,就没有人会过来跟我争抢的,因为都是好人对吧,他们会等我改完之后,他们再去改。这就是一个乐观的一个心态。
08:01
理解吧,但事实上的话呢,你想想啊,我在改的时候,那就一定他们都老老实实的等着你改完以后再改吗?不可能的,因为他们不是人啊,他们是一个县城,对不对,县城是没有思想的。你让他做什么事,他就去做什么事。对吧,所以说实际情况下,就是我在修改的时候呢,一定也会有人跟我过来去抢这个事儿,跟我去冲突。对吧,好,但是呢,我认为呢,大多数人还是好的,大多数人呢,他不会过来跟我抢,他只是什么过来去看一看,或者什么读一下这个数据就完事了。好,那么这种情况下,我怎么去控制这个事儿呢?我是这样去控制的。我不给你加锁,比如说我再去对这个100做修改的时候呢,我不加锁。假如说我是改的那个线程,你是读的那个线程,对吧,我不对他做加速操作,那我能够读到100,你也能够读到100,听懂了吧,那你读到100以后,比如说你就是一个读抄的,那你读完以后你就走了呀,就完事了,这个事就完事了,你会影响我这个修改吗?不会影响。
09:00
能听懂吧,不会影响啊好,那么假如说啊。我们这两个线程的都是一个改的操作,那我能够读到100,他也能够读到100,那接下来你们改是怎么去控制的呢。听好了,他这么去控制的,在这个乐观锁中,或者什么乐观并发控制里面,我们都会涉及到一个版本这个事儿就说白了,你这个数据不仅有个数据,你还会有一个对应的版本,比如说这个版本是零。那我在读的时候啊,就啊,我不仅要读你的数据,我还要读你的版本。比如说他读到了是100版本是零,他读到了也是100版本是零,这个时候你们就各自去做各自的操作吧,对吧?比如说我减了个一,我减成99了,减成99以后呢,那我要把99再写回到你的数据库里面,对不对,它也是一样的,要把99了再写回到数据库里面,好在写之前他会做一个什么操作啊,听好了同学们他会拿上我之前读到的这个版本,这个零啊,版本零,然后呢,去到你的数据库再去看一看,你当前库里面的版本还是不是零。
10:01
你看啊,假如说他手比较快啊,同学们他手快OK,那我读的时候呢,版本是零,然后呢,我再往里面去改的时候,我一看哟,版本还是零,好,那么他这个修改就是OK的,他是能够成功的。因为他手里面拿的版本跟数据库的版本是一样的,就说明没有人在我之前做过更改,那我就把它改成99了,不仅要把数据改成99,他还要对应的把版本的增加一,比如说我的版本变成一了。那这个时候呢,他比较手比较慢啊,他过来要去改了,他改的时候发现,诶,我手里面拿的是个零,但实际上数据库里面已经变成一了。他就会什么自动放弃这个操作,说我不能再改了。因为我手里面这个数据已经不是最新的数据了,在我的更改的过程中,已经有人对这个数据呢做了更改。明白吧,他就会放弃这个操作,我就不改了。听懂了吧,整个过程中我是没有所谓的锁机制的,没有加锁,那没有加锁的好处就是你在改的时候,别人是可以正常读的。
11:00
对吧,当然如果说我们都是改的请求的话,那就看谁手快呗。对吧,谁手快谁就成功了,谁手慢谁就失败了呗。他就没有所所谓的锁啊,说这个乐观锁,乐观锁虽然说叫锁,但实际上没有锁啊,它是一个无形的一个锁。理解吧。好。这就是我们这个乐观的没法控制,那我们的ES呢,其实就采用这种方式啊,就采用这种方式,它会一直什么,一直会增加版本的方式来去控制你这个,呃,就是并发的一个什么写操作。好吧,啊行,这个东西你就知道就得了啊,这种重点还是给大家去说一下,呃,两种方式,一种是悲观的并并发控制,一种是这个乐观的并发控制,然后你要知道这个ES用的是哪一种就行了啊,至于这个细节啊,我们就不用考虑它。因为我们毕竟也不是说要把这个ES的研究的有多透哈,我们就是能够正常的去使用它。好吧,行。呃,完善啊。
我来说两句