web api插入重复的行

时间:2018-04-02 09:12:25

标签: php mysql

我的代码:

$con = new PDO("mysql:host=localhost;dbname=mis","root","");

$name = $_POST['name'];
$transaction_status = $_POST['transaction_status'];
$client_id = $_POST['client_id'];
$group_id = $_POST['group_id'];

$statement = $con->prepare("select transaction_id from transaction_process where client_id='$client_id' and group_id='$group_id'"); 
$statement->execute();

$data = $statement->fetch(PDO::FETCH_ASSOC);
if($data){
..update query
} else {
..insert query
}
  

上面提到的是我的代码示例。

此代码在客户端调用web api并每分钟收集数千个事务时执行。 所以问题在于,我多次面对具有相同group_id和client_id的重复记录,我在上面的选择查询中尝试了更多修改,但仍面临同样的问题。

如果需要,我可以提供更多详细信息,但希望摆脱它。 请支持。

1 个答案:

答案 0 :(得分:1)

考虑到你进入api的连接数量,你可能需要write lock你的交易。请注意,在锁定过程中,其他会话将无法读取和写入数据(但这应该相对较快)。

$con = new PDO("mysql:host=localhost;dbname=mis", "root", "");

$name = $_POST['name'];
$transaction_status = $_POST['transaction_status'];
$client_id = $_POST['client_id'];
$group_id = $_POST['group_id'];

try {
    $con->exec('LOCK TABLE transaction_process WRITE');

    $statement = $con->prepare("SELECT transaction_id 
                                      FROM transaction_process 
                                      WHERE client_id = :clientId and group_id = :groupId");
    $statement->bindParam(':clientId',$client_id);
    $statement->bindParam(':groupId',$group_id);
    $statement->execute();

    $data = $statement->fetch(PDO::FETCH_ASSOC);
    if ($data) {
        do_something();
    } else {
         do_something_else();
    }

    $con->exec('UNLOCK TABLES');
} catch (Exception $e) {
    // catch any exceptions ..
}

有关表格锁定的更多信息,请查看此table locking tutorialMySQL documentation