Php - Mysqli: Сделки
У меня есть много запросов на вставку обновления, я написал запрос транзакции, но хочу знать, безопасно ли это или некоторые из них должны быть исправлены.
Кроме того, если все в порядке, я получаю успешно "Транзакция успешно завершена!" , но если что-то пошло не так, то сообщения об ошибке скоро не появятся, значит путают его работу или нет.
Будет$result_a
а также$result_b
будет откат, если$result_Cb
НЕДОСТАТОК или какой-то другой и стихотворный?
Ниже я попробовал. Пожалуйста, дайте мне знать, если что-то не так:
try {
/* switch autocommit status to FALSE. Actually, it starts transaction */
global $db;
mysqli_autocommit($db, FALSE);
$sqla ="INSERT INTO A () VALUES () ";
$result_a = mysqli_query($db,$sqla);
if($result_a){
$sqlb ="INSERT INTO B () VALUES () ";
$result_b = mysqli_query($db,$sqlb);
if($result_b){
$sqlCb ="UPDATE CB () SET ... ";
$result_Cb = mysqli_query($db,$sqlCb);
} else { echo "ERROR" ; }
} else {
echo "ERROR" ;
}
mysqli_commit($db);
echo 'Transaction completed successfully!';
} catch (Exception $e) {
echo 'Transaction failed: ' . $e->display_notification_centered(_("transaction rolled back"));
mysqli_rollback($db);
}
/* switch back autocommit status */
mysqli_autocommit($db, TRUE);
Выше просто простое обновление вставки, одна из моих страниц содержит
SELECT >> INSERT >> UPADATE >> SELECT >> INSERT ...
поэтому, пожалуйста, дайте мне знать, если что-то пошло не так. Я в безопасности со своими ПРАВИЛЬНЫМИ значениями базы данных.
РЕДАКТИРОВАТЬ: 14-02-2014 (добавьте МОЙ ИЗМЕНЕННЫЙ КОД НИЖЕ, так как я столкнулся с некоторой проблемой при откате на некоторых страницах)
function autocommitfalse(){
global $db;
/* switch autocommit status to FALSE. Actually, it starts transaction */
return mysqli_autocommit($db, FALSE);
}
function autocommittrue(){
global $db;
return mysqli_autocommit($db, TRUE);
}
function commitquery(){
global $db;
return mysqli_commit($db);
}
function rollbackedquery(){
global $db;
return mysqli_rollback($db);
}
===============================================================================
try {
autocommitfalse();
$SQLSELECT = "SELECT * FROM BC ";
$result_as = mysqli_query($db,$SQLSELECT);
if(!$result_as ){
throw new Exception('Wrong SQL SELECT: ' . $SQLSELECT_a. ' Error: '.db_error_msg($db) . db_error_no());
}
$sqla ="INSERT INTO A () VALUES () ";
$result_a = mysqli_query($db,$sqla);
if(!$result_a){
throw new Exception('Wrong SQL SELECT: ' . $result_a. ' Error: '.db_error_msg($db) . db_error_no());
}
$sqlb ="INSERT INTO B () VALUES () ";
$result_b =mysqli_query($db,$sqlb);
if(!$result_b){
throw new Exception('Wrong SQL SELECT: ' . $result_a. ' Error: '.db_error_msg($db) . db_error_no());
}
$sqlCb ="UPDATE CB () SET ... ";
$result_Cb = mysqli_query($db,$sqlCb);
if($result_Cb === false && mysqli_affected_rows($db) == 0 ){
throw new Exception('Wrong SQL SELECT: ' . $result_a. ' Error: '.db_error_msg($db) . db_error_no());
}
commitquery();
echo 'Transaction completed successfully!';
} catch (Exception $e) {
echo"<br \>";
echo "<table align=center><tr><td>";
echo $e->getMessage();
echo "</td></tr></table>";
echo"<br \>";
echo display_error(_("Transaction failed: transaction rolled back"));
rollbackedquery();
}
autocommittrue();
Если что-то не так ... пожалуйста, дайте мне знать об изменениях в нем (код выше) .. так, чтобы я был более ясным .... так как у меня есть много запросов "если и", но на моей какой-то странице я получаю откат, но некоторые страницы его нет , :(