ES 笔记三十七:处理并发读写操作

并发控制的必要性

  • 两个Web程序同时更新某个文档,如果缺乏有效的并发,会导致更改的数据丢失
  • 悲观并发控制
    • 假设有变更冲突的可能,会对资源加锁,防止冲突。例如数据库行锁
  • 乐观并发控制
    • 假设突然是不会发生的,不会阻塞正在尝试的操作。如果数据在读写中被修改,更新将会失败。应用程序决定如何解决冲突,例如重试更新,使用新的数据,或者将错误报告给用户
    • ES 采用的乐观并发控制

ES 笔记三十七:处理并发读写操作

ES的乐观并发控制

  • ES中的文档是不可变更的。如果你更新一个文档,会将会文档标记为删除,同时增加一个全新当文档,同时文档的version字段加1
  • 内部版本控制
    • If_seq_no + If_primary_term
  • 使用外部版本(使用其他数据库作为主要数据存储)
    • version + version_type = external

ES 笔记三十七:处理并发读写操作

DELETE products
PUT products
PUT products/_doc/1
{
  "title":"iphone",
  "count":100
}
GET products/_doc/1
//只能执行一次
PUT products/_doc/1?if_seq_no=0&if_primary_term=1
{
  "title":"iphone",
  "count":110
}
//数据库版本号为主
PUT products/_doc/1?version=23&version_type=external
{
  "title":"iphone",
  "count":130
}
本作品采用《CC 协议》,转载必须注明作者和本文链接

快乐就是解决一个又一个的问题!

讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!