CrateDB初探(四):乐观并发控制 (Optimistic Concurrency Contro

2022-02-25 00:00:00 数据 更新 并发 控制 乐观

在乐观并发控制中,用户读取数据时不锁定数据。当一个用户更新数据时,系统将进行检查,查看该用户读取数据后其他用户是否又更改了该数据。如果其他用户更新了数据,将产生一个错误。一般情况下,收到错误信息的用户将回滚事务并重新开始。这种方法之所以称为乐观并发控制,是由于它主要在以下环境中使用:数据争用不大且偶尔回滚事务的成本低于读取数据时锁定数据的成本。

即使CrateDB不支持事务,也可以通过_seq_no和_primary_term这两个系统列实现乐观并发控制(Optimistic Concurrency Control)。本文对CrateDB的乐观并发控制做个粗浅的介绍,详见官方文档。

系统列(system columns)
_seq_no和_primary_term是表的系统列之一,他们反映数据操作的顺序和集群的配置变化,通过select可以观察他们在每次数据操作之后的变化。

_seq_no
当表中一行数据被修改、新插入或者被删除后,primary shards会修改该行的_seq_no(相当于行的版本号)。类似的系统列还有_version,但是对于乐观并发控制_version已经不建议使用了。

更新id=1的行以后,该行的_seq_no+1, _primary_term: 1->6(_primary_term的变化猜测是因为从初始状态到本次update,中途因某些原因重启过集群)

乐观更新/删除
在更新或者删除前查询获得_seq_no和_primary_term的值,在执行时校验_seq_no/_primary_term,若被修改就不执行。这样避免应用的数据冲突不会导致数据丢失。

总结下:

来源 https://blog.csdn.net/gxf1027/article/details/104948354

相关文章