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

我在做一个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; 

图片说明

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

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

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

你建立的表是怎么样的