我在做一个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去分配,这样就避免每次进来还要重新去查前面已经安排好的寝室,减少查询次
你建立的表是怎么样的