2012-09-06 57 views
0

使用PHP和MySQL我想使用PARENT和多子关系来跟踪注册。 如果超过1个用户尝试使用相同的父代码注册,则会出现问题。该家长只会被记入1个用户而不是2个。 解决方案据我所知是LOCK记录。或者使用服务器时间和记录时间戳确定上次更新。使多个用户同时更新到同一记录

#THIS IS NOT PRODUCTION CODE, BUT JUST INTENDED TO DEFINE MY PROCESS 
#PLEASE ADVISE AND MAKE ADJUSTMENTS AS YOU SEE FIT 

$sqlget = SELCT * record of PARENT and WHERE id is of PARENT 
$ts -> timestamp; 
$st -> servertime; 
$af -> aff_number; 

现在我要检查父, 如果更新的发生的时间戳的最后一条记录更新不到10秒AGO - 我想重新运行我$ sqlget

如何转换$ ts转换为INT并将$ st转换为INT,以便我可以运行IF语句 以循环$ sqlget如果我的条件失败。

if($ts <= $st by 10 seconds) { wait 10 seconds and rerun sqlget } 
else { get current $af (INT) and +1; UPDATE record; close connection; 
META-refresh to next page; } 

那么这个过程似乎功能?这是否会确保即使超过1个孩子同时签署了每个孩子注册,也会正确记录一个父母? 我不希望多人同时注册,但他们可能会发生,我必须确保父母正确记分。

+0

“PARENT”记录如何在每个“CHILD”注册时记入? – eggyal

+0

“父母”的ID在单独的桌子上记录到“孩子”。这个表的目的是保留一个“Parant”子元素的数量。 – fyz

+0

那么,为什么不按照需要选择parent_id,COUNT(*)FROM子GROUP BY parent_id'呢?或者根据需要更新父项SET子项=子项+ 1项WHERE parent_id =?',这将以原子方式执行(并发会话无法干涉)。 – eggyal

回答

0

我不明白你的SQL结构。

如果您将“信用”与具有相同父母ID的新孩子的外观相关联,则任意数量的用户可能会同时加入。

只要运行:

INSERT INTO affiliations (id_p, ...) VALUES (id_of_parent, whatever_data); 

就大功告成了。父母和孩子是否在单独的桌子上是无关紧要的。重要的是,必须没有父母对子女的引用,即您唯一的引用是子行中父母的ID。这样你就没有并发问题了。

当你需要知道一个给定的父母有多少孩子得到的,简单地计算他们:

SELECT COUNT(*)FROM隶属关系WHERE id_p = id_of_parent;

我怀疑你现在在父行中存储一个计数器。如果是这样,不要:它看起来更简单,但并发性问题使它不值得付出努力。

+0

是的,我的意图是存储第一个孩子,第二个孩子和第三个孩子的“父母”数量。我认为每次'PARENT'想要检查他们的状态都是资源占用者时,对这些记录执行COUNT查询。 – fyz

+0

不是。如果您对父母的ID进行索引,则负载可以忽略不计;毕竟,你希望比父母有更多的孩子。所以,最好简化*小孩*维护。 – LSerni

相关问题