$Increment与$Sequence函数的区别及适用场景对比
以下讨论基于Intersystems Caché/IRIS及MUMPS语言环境下的$Increment(常简写为$IN)和$Sequence(常简写为$SEQ)函数:
核心区别
- 并发处理逻辑不同
$Increment是原子操作,单步完成读取变量当前值、加1、回写新值、返回新值的全流程,多进程同时操作同一个全局变量时不会出现冲突,所有进程拿到的都是唯一递增的值,但高并发下会出现明显的锁竞争,性能下降明显。$Sequence是专为高并发场景设计的实现,会给每个进程预先分配一段连续的数值区间,进程直接在自己的专属区间内取值,不需要每次都修改全局变量的根节点,锁竞争极少,高并发下性能远高于$Increment。 - 数值连续性保证不同
$Increment返回的数值是严格连续的,只要操作成功,每次调用返回的值比上一次大1,不会出现断层。$Sequence不保证严格连续:如果进程分配了区间没用完就退出,剩余的数值就会被浪费,最终生成的序列会有空缺;而且不同进程拿到的数值可能不是按调用顺序递增的,比如进程A先调用拿到101,进程B后调用可能拿到201(因为B分配的是200-300的区间)。 - 支持的变量范围不同
$Increment可以操作局部变量、进程私有全局变量、普通全局变量。$Sequence只能操作普通全局变量,不支持局部变量和进程私有全局变量。 - 事务回滚行为不同
$Increment的操作受事务回滚影响:如果事务回滚,$Increment对变量的修改会被撤销,已经返回过的值会被重新分配。$Sequence的操作不受事务回滚影响:就算调用$Sequence的事务回滚了,已经返回过的值也不会再被复用,避免了并发场景下主键重复的问题。
注意:如果是其他语言环境下的同名函数,行为可能存在差异,以上结论仅针对MUMPS体系下的这两个函数。
适用场景选择指南
- 优先选
$Increment的场景:- 对序列连续性要求极高,不能存在空缺,比如财务凭证编号、法定流水号要求必须连续无断号的场景
- 业务并发量不高,不会出现明显锁竞争的场景
- 需要对局部变量/进程私有变量做递增操作的场景
- 接受事务回滚后数值被复用的场景
- 优先选
$Sequence的场景:- 高并发场景下生成唯一主键、订单ID这类只要求数值唯一、不要求严格连续的场景
- 希望避免事务回滚导致主键重复的场景
- 并发量较大,用
$Increment已经出现性能瓶颈的业务
内容的提问来源于stack exchange,提问作者Muhammad Waseem
相关产品推荐
相关产品推荐

