1、_version元数据
第一次创建一个document的时候,它的_version内部版本号就是1;
以后,每次对这个document执行修改或者删除操作,都会对这个_version版本号自动加1;
哪怕是删除,也会对这条数据的版本号加1
在删除一个document之后,它不是立即物理删除掉的,因为它的一些版本号等信息还是保留着的。先删除一条document,再重新创建这条document,其实会在delete version基础之上,再把version号加1
2、es内部的多线程异步并发修改时,是基于自己的_version版本号进行乐观锁控制的
在es后台,很多的这种类似的replica同步请求,都是多线程异步的,也就是说多个修改请求之间,是乱序的,没有顺序,可能先改的后到,后修改的先到。
假设es内部没有进行乐观锁并发控制,后修改的先到了,然后先修改的后到,那么先修改的数据就会把后修改的数据给覆盖的。这个时候数据就错了。
如果真的发生了后修改的数据先到,先修改的数据后到,es内部的机制是会先把后修改先到的数据保存,并且把版本号+1。
先修改后到的数据会对比一下版本号,如果不相等的话直接将这条数据扔掉,这样的话数据的结果就会保持一个正确的状态。