您好!欢迎来到 南京典乐信息科技有限公司 ,江苏大型门户网站建设顶尖技术团队!
热点新闻
通用流水号实现

先请求序列号的,不一定提交成功,甚至可能根本就没有提交(用户放弃,或者操作超时被迫放弃,或者其他原因之类的)。文中的思路,就是在读取的时候就把当前流水号坑给霸占了;下一个人再取的时候,就只能取下一个流水号了。文中也明确阐述这个解决方案的缺点:如果上一个人取到的业务流水号最后没有保存,则这个流水号就废了(跳过去了),导致最后的实际的业务流水号不连续。计算机中是时间,也不是精确的自然时间,而是按Tick来算的。如果CPU正忙的时候,同时到达了N个请求,则下次CPU调度到哪个线程,可能也不好说(我不太确定)
还有一种情况,文中有提到,更新序列号有两个方案,一种是读时更新,一种是写时更新。本文的侧重于读时更新,也就是说在读取序列号的时候就取得了序列号001,下一个人只能取得下一个序列号002;这也就存在一种可能,就是后一个人先提交002,而前一个人慢提交001,结果就出现了先提交的序列号(002)比后提交的序列号(001)大的情况。

对于第一种情况,理论上应该可以忽略。
对于后一种情况,这个解决方案侧重的是读取的时候获取并占用最大序列号,是按读取时间来算的,而不是按提交时间来算的。如果一定要需要严格控制的话,可以有两个思路:(1). 提交的时候,在键值表中判断(这次可以加With(nolock)来读取),是否比最大值小,小则给予提示或者重新生成序列号;这种做法的缺点就是并发量大的话,序列号浪费会比较严重;(2). 采用写时更新,将分配序列号的操作放到提交事务中;打开表单的时候不要分配流水号,而是在真正提交的时候才进行分配,但这样做的缺点就是所有对同一类业务的所有操作,必须串行化操作,这个问题文中也有讨论。
我一般是在创建时间上建立聚集索引,很多业务查询/统计都是按时间段来查询统计的,这样可以直接用上聚集索引,筛掉一大批数据;
流水号上做一个唯一非聚集索引。
 

下一篇新闻-考虑过性能问题

Copyright @2011-2018 南京典乐信息科技有限公司 版权所有 全国联线:400-025-1949
南京市中华路420号江苏省高新技术创业园5层 项目经理:13851941123 QQ:260193150 点击这里给我发消息
本站关键词:南京网站建设 南京网站设计 南京随家仓网站制作 南京设计公司