悲观锁和乐观锁
1、悲观并发控制
这种方法被关系型数据库广泛使用,它假定有变更冲突可能发生,因此阻塞访问
资源以防止冲突。 一个典型的例子是读取一行数据之前先将其锁住,确保只有放
置锁的线程能够对这行数据进行修改。
2、乐观并发控制
Elasticsearch 中使用的这种方法假定冲突是不可能发生的,并且不会阻塞正在
尝试的操作。 然而,如果源数据在读写当中被修改,更新将会失败。应用程序接
下来将决定该如何解决冲突。 例如,可以重试更新、使用新的数据、或者将相关
情况报告给用户。
POST和PUT的介绍
1.更新:PUT会将新的json值完全替换掉旧的;而POST方式只会更新相同字段的值,其他数据不会改变,新提交的字段若不存在则增加,原有字段如果在新提交的字段中没有,则字段会丢失,这里就要使用_update
2.PUT和DELETE操作是幂等的。所谓幂等是指不管进行多少次操作,结果都一样。比如用PUT修改一篇文章,然后在做同样的操作,每次操作后的结果并没有什么不同,DELETE也是一样。
3.POST操作不是幂等的,比如常见的POST重复加载问题:当我们多次发出同样的POST请求后,其结果是创建了若干的资源。
4.创建操作可以使用POST,也可以使用PUT,区别就在于POST是作用在一个集合资源(/user)之上的,而PUT操作是作用在一个具体资源之上的(/user /123)。
提到过POST和PUT新增字段在原有字段中没有,原有的字段就消失了_update可以单独更新某个数据.
_seq_no和_primary_term介绍
- _version表示当前数据新的版本号;老版本使用
- _seq_no其实和version同一个道理,一旦数据发生更改,数据也一直是累计的;_seq_no是全局加一
- _primary_term表示是由谁分配的,意思说如果文档在一个集群里面,文档肯定会被分配一个位置,_primary_term表示的就是一个位置;
PUT和POST在操作数据的时候_seq_no都会加1
PUT操作
PUT /my_doc/_doc/1
{
"id": 1,
"name": "张三"
}
POST操作
POST /my_doc/_doc/1
{
"id": 1,
"name": "张三"
}
_seq_no都会加一
{
"_index" : "my_doc",
"_type" : "_doc",
"_id" : "1",
"_version" : 40,
"result" : "updated",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no " : 39,
"_primary_term" : 1
}
当POST结合_update使用的时候,如果值没有发生变化, _seq_no不会加一
POST /my_doc/_update/1
{
"doc": {
"name": "李四1"
}
使用乐观锁
POST /my_doc/_update/1/?if_seq_no=1&if_primary_term=1
{
"doc": {
"name": "张三"
}
}
如果_seq_no与_primary_term当前文档不一致的时候
{
"error" : {
"root_cause" : [
{
"type" : "version_conflict_engine_exception",
"reason" : "[1]: version conflict, required seqNo [1], primary term [1]. current document has seqNo [40] and primary term [1]",
"index_uuid" : "pZXBlHMoSrG-s_ovuFGKtQ",
"shard" : "0",
"index" : "my_doc"
}
],
"type" : "version_conflict_engine_exception",
"reason" : "[1]: version conflict, required seqNo [1], primary term [1]. current document has seqNo [40] and primary term [1]",
"index_uuid" : "pZXBlHMoSrG-s_ovuFGKtQ",
"shard" : "0",
"index" : "my_doc"
},
"status" : 409
}
网友评论