Как написать транзакцию для 2 подготовленных операторов, чтобы обеспечить фиксацию или откат - PullRequest
0 голосов
/ 02 октября 2018

Для этих запросов ниже,

/*----------------------------------------------------Update temporary-----------------------------------------------------------------*/
$con = new mysqli('localhost','aaa','bbb','db');

$sql1 = $con->prepare("	UPDATE temporary 	SET status = 1 WHERE 	cat_no 	= ? AND po_no = ?");
$sql1->bind_param('ss', $cat_no, $po_no);
$sql1->execute(); 
/*----------------------------------------------------Update products-------------------------------------------------------------*/
$sql2 = $con->prepare("	UPDATE products 	SET qty = ? WHERE 	cat_no 	= ? ");
$sql2->bind_param("ss", $qty, $cat_no);
$sql2->execute(); 

mysqli_close($con);

Как записать транзакцию так, чтобы:

1) Если какой-либо из операторов не выполнен, он возвращается к исходному состоянию.

2) оба оператора успешно выполняются, затем фиксируют его.

Кто-нибудь может помочь?

1 Ответ

0 голосов
/ 02 октября 2018

Попробуйте что-то вроде этого:

try
{
  $conn = new PDO("mysql:host=localhost;dbname=db","aaa","bbb");
  $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
}
catch(PDOException $e)
{
  echo "Could not acquire database handle: ".$e->getMessage(); 
}

$stm1 = $conn->prepare("UPDATE temporary SET status = 1 WHERE cat_no = ? AND po_no = ?");
$stm2 = $conn->prepare("UPDATE products SET qty = ? WHERE cat_no = ?");

$conn->beginTransaction();
try
{
  $stm1->execute(array($cat_no, $po_no));
  $stm2->execute(array($qty, $cat_no));
  $conn->commit();
}
catch (PDOException $e)
{
  $conn->rollBack();
  echo "SQL error = ".$e->getMessage();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...