Maison >développement back-end >tutoriel php >Comparaison de l'utilisation et des opérations des transactions PHP mysql et mysqli

Comparaison de l'utilisation et des opérations des transactions PHP mysql et mysqli

巴扎黑
巴扎黑original
2017-05-26 16:12:411605parcourir

Tout d'abord, la connexion mysqli est une connexion permanente, tandis que mysql est une connexion non permanente. Qu'est-ce que ça veut dire? Chaque fois que la connexion mysql est utilisée pour la deuxième fois, un nouveau processus sera rouvert, tandis que mysqli n'utilise que le même processus, ce qui peut réduire considérablement la pression côté serveur

mysqli encapsule les transactions, etc. Certains avancés Les opérations encapsulent également de nombreuses méthodes disponibles dans le processus d'exploitation de la base de données.

L'application la plus courante est celle des transactions mysqli.

Par exemple, l'exemple suivant :

Le code est le suivant :

$mysqli = new mysqli('localhost','root','','DB_Lib2Test');
$mysqli->autocommit(false);//开始事物
$mysqli->query($sql1);
$mysqli->query($sql2);
if(!$mysqli->errno){
  $mysqli->commit();
  echo 'ok';
}else{
 echo 'err';
  $mysqli->rollback();
}

En PHP, mysqli a bien encapsulé la transaction mysql fonctionnement connexe. L'exemple suivant :

Le code est le suivant :

$sql1 = "update User set ScoreCount = ScoreCount +10 where ID= '123456'";
$sql2 = "update ScoreDetail  set FScore = 300 where ID= '123456'";
$sql3 = "insert into  ScoreDetail ID,Score) values ('123456',60)";
$mysqli = new mysqli('localhost','root','','DB_Lib2Test');
$mysqli->autocommit(false); // 开始事务
$mysqli->query($sql1);
$mysqli->query($sql2);
if (!$mysqli->errno) {
 $mysqli->commit();
 echo 'ok';
} else {
 echo 'err';
 $mysqli->rollback();
}

Ici, nous utilisons la série de fonctions php mysql pour effectuer des transactions.

Le code est le suivant :

$sql1 = "update User set ScoreCount = ScoreCount +10 where ID= '123456'";
$sql2 = "update ScoreDetail  set FScore = 300 where ID= '123456'";
$sql3 = "insert into  ScoreDetail ID,Score) values ('123456',60)";
$conn = mysql_connect('localhost','root','');
mysql_select_db('DB_Lib2Test');
mysql_query('start transaction');
//mysql_query('SET autocommit=0');
mysql_query($sql1);
mysql_query($sql2);
if (mysql_errno()) {
 mysql_query('rollback');
 echo 'err';
} else {
 mysql_query('commit');
 echo 'ok';
}
// mysql_query('SET autocommit=1');
// mysql_query($sql3);

Il convient de noter ici que

MyISAM : ne prend pas en charge les transactions et est utilisé pour les programmes en lecture seule pour améliorer les performances
InnoDB : prend en charge les transactions ACID, les verrous au niveau des lignes et la concurrence
Berkeley DB : prend en charge les transactions
Encore une chose à noter : le comportement par défaut de MySQL est d'exécuter une instruction COMMIT après chaque instruction SQL. exécuté, convertissant ainsi efficacement chaque instruction autonome en une transaction.

Mais souvent, lorsque nous devons utiliser des transactions, nous devons exécuter plusieurs instructions SQL. Cela nous oblige à définir manuellement l'attribut autocommit de MySQL sur 0, qui est par défaut 1.

En même temps, utilisez l'instruction START TRANSACTION pour ouvrir explicitement une transaction. Comme l'exemple ci-dessus.

Quelles seront les conséquences si vous ne le faites pas ?

Nous supprimerons les commentaires //mysql_query(‘SET autocommit=0′); et // mysql_query($sql3); dans le deuxième morceau de code ci-dessus, puis exécuterons.

Pour le moment, mysql_query($sql3) ne sera pas inséré dans la base de données lors de son exécution.

Si nous supprimons le commentaire // mysql_query(‘SET autocommit=1′);, alors mysql_query($sql3);

Habituellement, une transaction est terminée lorsqu'une instruction COMMIT ou ROLLBACK est exécutée, mais certaines instructions DDL déclencheront implicitement COMMIT.

Par exemple, l'instruction suivante

ALTER FUNCTION
ALTER PROCEDURE
ALTER TABLE
BEGIN
CREATE DATABASE
CREATE FUNCTION
CREATE INDEX
CRÉER UNE PROCÉDURE
CRÉER UNE TABLE
DROP DATABASE
DROP FUNCTION
DROP INDEX
DROP PROCEDURE
DROP TABLE
UNLOCK TABLES
CHARGER LES DONNÉES MAÎTRES
LOCK TABLES
RENAME TABLE
TRUNCATE TABLE
SET AUTOCOMMIT=1
START TRANSACTION

Prenons un autre exemple.

Le code est le suivant :

$sql1 = 'create table ScoreDetail_new(id int)';
$sql2 = 'rename table ScoreDetail to ScoreDetail_bak';
$sql3  = 'rename table ScoreDetail_new to ScoreDetail';
$mysqli = new mysqli('localhost','root','','DB_Lib2Test');
$mysqli->autocommit(false);//开始事物
$mysqli->query($sql1);
$mysqli->query($sql2);
$mysqli->query($sql3);
if (!$mysqli->errno) {
 $mysqli->commit();
 echo 'ok';
} else {
 echo 'err';
 $mysqli->rollback();
}

Dans l'exemple ci-dessus, si $sql2 ne parvient pas à s'exécuter, $sql1 sera toujours exécuté. Pourquoi?

Parce que lorsque rename est exécuté, mysql exécutera d'abord commit puis renommera par défaut.

Remarque

Seules les tables de données de type INNODB et BDB dans MYSQL peuvent prendre en charge le traitement des transactions ! Les autres types ne sont pas pris en charge !

*** : Généralement, le moteur par défaut de la base de données MYSQL est MyISAM. Ce moteur ne prend pas en charge les transactions ! Si vous souhaitez que MYSQL prenne en charge les transactions, vous pouvez le modifier manuellement vous-même :

La méthode est la suivante : 1. Modifiez le fichier c:/appserv/mysql/my.ini, recherchez skip-InnoDB, ajoutez # devant et enregistrez le fichier .

2. Saisissez : services.msc pendant le fonctionnement pour redémarrer le service mysql.

3. Accédez à phpmyadmin, mysql->show moteurs; (ou exécutez mysql->show variables comme 'have_%';), vérifiez InnoDB pour OUI, ce qui signifie que la base de données prend en charge InnoDB.
Cela signifie que les transactions transactionnelles sont prises en charge.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn