我的系统现在遇到很大的实时问题。想象一下,您可以注册订阅。假设最多只有3名参与者。当有3个人到达时,必须为所有人关闭订阅!这是我的代码的一部分:
function subscription_data($subid) // activated by ajax
{
$sql = 'SELECT subEnrolled, subStatus FROM subscription WHERE subID=:subid';
$stmt = $db->prepare($sql);
$stmt->bindparam("subid", $subid);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
$subEnrolled = $row['subEnrolled'];
$subParticipants = '3';
// is this subscription already closed ???
if (!($row['subStatus'] =='1')) // if '1' not run anymore
{
if( $subEnrolled+1 == $subParticipants )
{
$status1 = '1'; // close subscription for the NEXT fire
$sql = 'UPDATE subscription SET subStatus=:substatus WHERE subID=:subid';
$stmt = $db->prepare($sql);
$stmt->bindparam("subid", $subid);
$stmt->bindparam("substatus",$status1);
$stmt->execute();
}
//
// DO SOMETHING MORE
//
// Add to one enrollment
$add1enroll = '1';
$sql = 'UPDATE subscription SET subEnrolled=subEnrolled+:subenrolled WHERE subID=:subid';
$stmt = $db->prepare($sql);
$stmt->bindparam("subenrolled", $add1enroll);
$stmt->bindparam("subid", $subid);
$stmt->execute();
}
}
我的问题是我希望在超过例如3人报名参加。但是,如果我快速点击我的AJAX按钮以激活该功能,使用多个帐户(4),我实际上可以从3中获得4个注册。我试图通过上面的if( $subEnrolled+1 == $subParticipants )
来避免这种情况 - 这是最后一个特例注册订阅的参与者。它不起作用。
希望你了解我的变量,我尽量使它们成为逻辑。上面的代码也在transaction()
函数中,我一般使用InnoDB表,但如果我改变它,我仍然有同样的问题。
答案 0 :(得分:1)
在事务中包装语句时,只有在尝试运行INSERT,UPDATE或其他此类语句时才会应用表锁。
您应该在WHERE子句中添加另一个条件,以检查有多少个注册。
UPDATE subscription
SET subEnrolled=subEnrolled+:subenrolled
WHERE
subID=:subid AND
subEnrolled < 3
可能还需要从+1
删除if( $subEnrolled+1 == $subParticipants )
。