脚本执行语句为update role set authority_info=authority_info+1 where id = 7
此条语句为等值查询会退化为间隙锁 , 加锁范围为(510) , 若此时来了一个用户执行语句为insert into role (888)
很遗憾是执行不成功的 。
update将(510)的数据加了间隙锁 , 在没有释放锁的情况下 , 这个范围的所有数据是无法添加的 。
当然这种情况仅在无主键索引的情况下会产生 , 因为主键索引的等值查询会退化为行锁 。
总之使用脚本刷数据是百害而无一利的 , 接下来看看如何处理这种情况 。
1-2 应用场景每一家公司注册后 , 默认有几个角色 , 如超管、子管、财务、行政、人事等 , 所有权限都绑定在相应的角色下 , 使用单条记录方式 。
既然需要添加一个CUI功能模块 , 就需要添加此模块对应的权限 , 默认情况下为所有租户相应的所有角色添加这个权限 。
每一个租户对应角色的权限都存储在角色表中 , 所有权限信息是在一个json串中存储
, 并切维护了一个更新时间 。
那么我们就以获取权限为切入点 , 主系统单独维护一个权限表 , 来看看这个过程是怎样的 。
1-2 方案落地那么如何在这个设计上进行优化 , 确保后期不再使用脚本进行刷数据 , 而是让用户自主触发 。
role表结构数据如下
系统表
系统添加新功能需要设置权限时 , 将权限名以json存储至系统表的auth_info中 , 每次更新权限都添加一条数据 。
用户登录后获取role表的更新时间 , 去系统表中做判断将大于role时间的数据拿出来 , 将查询出来的权限合并到role表中 , 并更新这条记录的更新时间 。
并将新增的权限维护至应用初始化中 , 新注册的用户需将所有的权限给添加上
, 这点根据自身系统看是否需要维护 。
1-4 方案弊端此方案虽然解决了每次添加新权限需要执行脚本 , 但不可避免用户每次登录获取权限时都需要使用自身的权限时间跟系统权限时间做比对 。
无形中会多进行一次查询 , 这也是咔咔目前能想到的方案 , 你要是有更好的方案可以探讨一下 。
三、总结本文围绕实际业务进行讨论了脚本如何写、设计缺陷如何后期弥补 , 在脚本中一定要使用正序(防止新用户注册进来)这点相信大家都清楚 。
方案在我看来还不是最优的 , 你要是有更好的思路 , 可以在评论区扩展一下 。
坚持学习、坚持写作、坚持分享是咔咔从业以来所秉持的信念 。 愿文章在偌大的互联网上能给你带来一点帮助 , 我是咔咔 , 下期见 。
- 单片机|快2022年,从事单片机/硬件开发前景到底如何?
- 银河系|银河系和仙女座星系的碰撞已经开始?太阳系未来的命运会如何?
- |如何区分三相电源的相序?
- 银黑狐|罕见银黑狐现身北京门头沟,如狗般乖巧,它们是如何被驯化的?
- 新型冠状肺炎|曾经危机地球的生机,氧气如何慢慢变成了“毒气”
- |如果我们能控制时间,那会如何?答案无法想象
- 鹿茸|探索未来:元宇宙将彻底摧毁人类婚姻制度?未来人如何繁衍后代?
- |1970年我国发射第一颗卫星,如今现状如何?
- 自媒体|注意这4个问题,你就能获得第二份副业收入,上班族如何做自媒体
- 英特尔|中兴AXon30Pro、真我GT与红米K40Pro之间,该如何选?