表的乐观锁

乐观锁,通常和悲观锁进行对比。

悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞,直到它拿到锁。

乐观锁:总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,只在更新的时候会判断一下在此期间别人有没有去更新这个数据。

从乐观锁的描述可知,乐观锁其实是不加锁的,那它是如何保证数据的一致性?

版本 Version 机制

使用数据版本(Version)记录机制,是乐观锁最常用的一种实现方式,也是平台这边使用的方式。

何谓数据版本?即为数据增加一个版本标识,一般是通过为数据库表增加一个数字类型的 version 字段来实现。

当读取数据时,将 version 字段的值一同读出,数据每更新 1 次,对此 version 值加 1。

当我们提交更新的时候,判断数据库表对应记录的当前版本信息与第一次取出来的 version 值进行比对,如果数据库表当前版本号与第一次取出来的 version 值相等,则予以更新,否则认为是过期数据。也就是别人已经抢先修改了,这次修改只能失败了。用下面的一张图来说明:

1703848291882

乐观锁设置

手动创建

在数据集增加一列数字类型的列,用于实现乐观锁的能力:

1703848804325

点击字段右侧的三个点,显示更多高级设置。其中需要勾选版本锁选项即可。

1703849038975

模板创建

如果是使用模板来创建数据集,默认的模板都带有乐观锁的列,根据需要任选其一均可:

1703849038975

模板创建出来的数据集,已经自动帮我们配置好了乐观锁的功能,直接使用即可:

1703849038975

乐观锁效果

该列的数值从 0 开始,平台在前端页面、数据菜单、dbrest 等多个地方都会自动维护该值的递增。只有在后端写代码时,需要开发者自行 +1 维护。

1703849247301

每条记录每次修改时,该记录的锁列的数值会自动 +1。

1703849352387

如果出现并发操作,该列被其他人抢先修改了,那么保存时会提示异常,造成此次保存不成功:

1703849352387

results matching ""

    No results matching ""