求教一个代码设计问题(高并发操作固定数据库资源)

iori2882 2018-04-10 02:25:29
我的问题是这样的:下图15个格子代表数据库的15条记录,大量用户对这些格子进行请求,格子的状态有以下几种:未定-预定-已定,同时"已定"用户在使用完成后,状态要置为"未定"状态.
如果让大量用户同时直接访问数据库,我感觉状态肯定会乱掉的,遇到这种问题应该怎么设计啊?
麻烦有经验的大神帮忙出出主意.初步我想的是,系统初始化的时候一次性的把所有格子的状态都读到内存中,好像线程池那样维护一个状态池,当用户请求的时候,如果有未定状态的就分配给用户,然后更新数据库,如果数据库更新成功,那么把这个未定状态的数据给移动到预定状态的池子中.
因为状态的事情比较严谨,如果乱掉了一个,那么整个系统就瘫痪了,核心需求就是大并发的状态下,数据的状态不乱不出错
我这表达能力有限,不知道说的清楚不清楚.

...全文
655 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
iori2882 2018-04-13
  • 打赏
  • 举报
回复
引用 10 楼 hanjun0612 的回复:
缓存只是加快访问速度,防止并发的办法就是加锁
是这样的。 不过正因为存在这种问题,所以会将缓存数据放在2个服务器,防止其中一台出现数据问题。 这个其实和数据库多主备份是一个概念。[/quote] 麻烦版主了,是这样的,现在要做一个酒店房间预定系统,其中房间预定模块在高并发的情况下感觉肯定出问题啊,A顾客在查询房间是空闲状态,在他提交预定请求还没更新完数据库的情况下,B又查询这个房间还是空闲状态,这样就会出现一个房间2个人同时预定的情况,目前我就能想到这一种问题.肯定还有其他什么问题我没想到的 如果要保证客人能正确的预定到房间,这个事情是加锁就能解决的么?加什么锁啊?读排它锁?心里好慌啊,这一块我还没有能力能处理好
正怒月神 2018-04-13
  • 打赏
  • 举报
回复
引用 11 楼 iori2882 的回复:
[quote=引用 10 楼 hanjun0612 的回复:] 缓存只是加快访问速度,防止并发的办法就是加锁
是这样的。 不过正因为存在这种问题,所以会将缓存数据放在2个服务器,防止其中一台出现数据问题。 这个其实和数据库多主备份是一个概念。[/quote] 麻烦版主了,是这样的,现在要做一个酒店房间预定系统,其中房间预定模块在高并发的情况下感觉肯定出问题啊,A顾客在查询房间是空闲状态,在他提交预定请求还没更新完数据库的情况下,B又查询这个房间还是空闲状态,这样就会出现一个房间2个人同时预定的情况,目前我就能想到这一种问题.肯定还有其他什么问题我没想到的 如果要保证客人能正确的预定到房间,这个事情是加锁就能解决的么?加什么锁啊?读排它锁?心里好慌啊,这一块我还没有能力能处理好[/quote] 哦,这个不加锁也没关系,插入前再次验证房间状态就好了。
正怒月神 2018-04-12
  • 打赏
  • 举报
回复
引用 8 楼 iori2882 的回复:
[quote=引用 5 楼 li498833284 的回复:] 缓存只是加快访问速度,防止并发的办法就是加锁
是这样的。 不过正因为存在这种问题,所以会将缓存数据放在2个服务器,防止其中一台出现数据问题。 这个其实和数据库多主备份是一个概念。
iori2882 2018-04-12
  • 打赏
  • 举报
回复
引用 7 楼 hanjun0612 的回复:
至于什么时候更新到数据库,就看你们什么时候空闲,然后就更新导数据库就好了
不立即更新数据库,,是不是停电就废了啊?
iori2882 2018-04-12
  • 打赏
  • 举报
回复
引用 5 楼 li498833284 的回复:
缓存只是加快访问速度,防止并发的办法就是加锁
消息队列不能防止并发么?先进先出不行么??麻烦解惑谢谢
正怒月神 2018-04-11
  • 打赏
  • 举报
回复
至于什么时候更新到数据库,就看你们什么时候空闲,然后就更新导数据库就好了
正怒月神 2018-04-11
  • 打赏
  • 举报
回复
1 首先内存里的操作肯定快于数据库 所以要把状态放到内存里操作 2 接着就是控制15条数据的并发访问了 这要对15条数据进行Lock
li498833284 2018-04-11
  • 打赏
  • 举报
回复
缓存只是加快访问速度,防止并发的办法就是加锁
iori2882 2018-04-11
  • 打赏
  • 举报
回复
引用 3 楼 oyljerry 的回复:
最好就是不都直接读取数据库,而是通过redis等来做cache
麻烦版主,能说的在具体一点么?
oyljerry 2018-04-10
  • 打赏
  • 举报
回复
最好就是不都直接读取数据库,而是通过redis等来做cache
iori2882 2018-04-10
  • 打赏
  • 举报
回复
引用 1 楼 Info_Qi 的回复:
用缓存,做消息队列
mysql的默认事物隔离级别为Repeatable read 是不是可以不用消息队列了?
Info_Qi 2018-04-10
  • 打赏
  • 举报
回复
用缓存,做消息队列

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧