我的代码:
$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的重复记录,我在上面的选择查询中尝试了更多修改,但仍面临同样的问题。
如果需要,我可以提供更多详细信息,但希望摆脱它。 请支持。
答案 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 tutorial或MySQL documentation