一个新生报道宿舍分配的问题

我在做一个PHP的新生报到的东西,我设置的一个宿舍可以住三个专业,每个新生都有自己的专业,根据专业住进不同的宿舍,宿舍最多住6个人,我想自动分配,先开启了事务,循环 从宿舍的第一个专业开始查看是否有匹配,没有则匹配第二个专业,以此类推,当找不到的时候跳出循环,找到以后用

 UPDATE `Building`  SET `ExistSum`=ExistSum+1,`version`=version+1  WHERE  `ID` = 62  AND `version` = 0

然后判断是否更新完成,更新成功了,跳出循环,不成功就继续循环,
但是,我在测试的时候发现一开始还好,但是大概40个左右就会卡死,好像是因为行锁的原因,请教一下大家,有没有好办法优化下,测试是我用Python写的开了40个线程,读取队列,.每0.1秒访问一次,数据都是提前准备好的
表结构:

 CREATE TABLE `Building` (   `ID` int(6) NOT NULL,   `isdel` tinyint(1) NOT NULL DEFAULT '0',   `Building` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL,   `DormNumber` varchar(3) COLLATE utf8mb4_unicode_ci NOT NULL,   `Department` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',   `money` int(3) NOT NULL DEFAULT '800',   `Sum` int(1) NOT NULL DEFAULT '6',   `ExistSum` int(1) DEFAULT '0',   `MainMajorID` varchar(3) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',   `SecondMajorID` varchar(3) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',   `ThiredMajorID` varchar(3) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',   `Sex` varchar(2) COLLATE utf8mb4_unicode_ci DEFAULT '男' COMMENT '真男假女',   `remark` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',   `version` int(3) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; 

图片说明

4个回答

这是多线程问题把表锁死了、

weixin_42649531
好名字容易记 多线程问题
大约一年之前 回复
weixin_41976242
weixin_41976242 觉得我的思路有用的话,送几个C给我,在线等,继续几个下载东西。。。
大约一年之前 回复
weixin_41976242
weixin_41976242 我在C#里面是这样处理的:第一步 //声明静态只读锁对象 private static readonly object o = new object(); 然后再在业务逻辑外面加 lock (o) { 比如这里加你的UPdate方法 } 通过这种方式来处理,不管有多少个线程走到这里来之后都会排队一个个处理了
大约一年之前 回复
weixin_41976242
weixin_41976242 回复sdfgjhdgh: 有办法的,不过你需要再业务逻辑层进行处理,PHP我不懂,但是我可以提供思路给你
大约一年之前 回复
sdfgjhdgh
陌生人233 您有什么好的办法吗?我感觉并发量应该还能提高,但是我能力有限,看了很多东西,但是还是没办法优化
大约一年之前 回复

没多少活要干为什么开40个线程,如果每0.1秒分配一个是为了控制节奏,那么多线程是为了加快节奏? 建议一个线程足够,原因正是出在这里。如果非要多线程注意务要放在循环内部防锁死

sdfgjhdgh
陌生人233 额,因为我们学校比较落后,所以接新生的时候可能会有100人同时登录,所以想试试看,我想让尽可能多的人用这个,您有什么优化的办法吗?
大约一年之前 回复

可以就一个线程啊,就是把宿舍按照id从1到最大的分区排好,如果1满了,加入缓存,下次进来直接取缓存里的数字,然后加1去分配,这样就避免每次进来还要重新去查前面已经安排好的寝室,减少查询次

sdfgjhdgh
陌生人233 那个,我们这里专业是随意分给宿舍,所以中间是有断层的,还有就是40个线程是我用来模拟登录的,您有啥好的办法吗?
大约一年之前 回复

你建立的表是怎么样的

sdfgjhdgh
陌生人233 您好,我把表结构发到问题里了,您看下,这边发不了
大约一年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!