это правильно для транзакции? - PullRequest
0 голосов
/ 29 апреля 2018

Я создаю транзакцию mysql, используя pdo.

Пожалуйста, проверьте, совершенен ли мой код или нет. если это не правильно, то как я могу установить транзакцию правильно.

Нужно ли использовать блок try? Как я могу сортировать попробовать блок в этом запросе

if(is_null($this->pdo)){
return false;
} else {
$pdo = $this->pdo;

$pdo->beginTransaction();

$stmt = $pdo->prepare("SELECT mallu FROM users WHERE id=? LOCK IN SHARE MODE");
$stmt->execute([$alpharef]);
$reseller = $stmt->fetch();
$stmt = null;


$stmt = $pdo->prepare("UPDATE users SET mallu = mallu - :cost WHERE id=:userid");
$stmt->bindParam(':cost', $cost, PDO::PARAM_STR);
$stmt->bindParam(':userid', $alpharef, PDO::PARAM_INT);
if (stmt->execute() != true) {
  $conn->rollBack();
  return false
}
$stmt = null;


$dates = date("d-m-Y");
$statos = 0;
$stmt = $pdo->prepare("INSERT INTO request (rtyp, num, amount, cost, typ, usr, refid, tm, dates, status) VALUES (:rtyp, :num, :amount, :cost, :typ, :usr, :refid, NOW(), :dates, :status)");
$stmt->bindParam(':rtyp', $retyp, PDO::PARAM_STR);
............................................................
if (stmt->execute() != true) {
  $conn->rollBack();
  return false
}
$stmt = null;
$pdo->commit();
$this->msg = 'Request sent successfully';
return true;

}
$pdo = null;

1 Ответ

0 голосов
/ 29 апреля 2018

Посмотрите на этот псевдокод. Try + catch помогает обрабатывать неудачные транзакции. Все, что вам нужно сделать, это выдать новое исключение, когда один из ваших sql не сработал.

$pdo->beginTransaction();
try{
    //DB_operation1
    if (result==false){ throw new Exception("...message1...");}

    //DB_operation2
    if (result==false){ throw new Exception("...message2...");}

    $pdo->commit();
}catch(exception $e){
    $pdo->rollBack();
    //do something with thrown message
}
...