Maison  >  Article  >  développement back-end  >  Introduction à la méthode d'implémentation des transactions php (exemple de code)

Introduction à la méthode d'implémentation des transactions php (exemple de code)

不言
不言avant
2019-02-20 11:33:102923parcourir

Ce que cet article vous apporte est une introduction à la méthode d'implémentation des transactions PHP (exemples de code). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

<?php
$db = new mysqli("localhost","root","","test"); //连接数据库
$db->autocommit(false); //设置为非自动提交——事务处理
$sql1  = "INSERT INTO `test`.`test1` (`name` )VALUES (&#39;1&#39; )";
$result1 = $db->query($sql1);
$sql2  = "INSERT INTO `test`.`test2` (`a` )VALUES (&#39;1&#39;)";
$result2 = $db->query($sql2);
if ($result1 && $result2) {
$db->commit();  //全部成功,提交执行结果
echo &#39;提交&#39;;
} else {
$db->rollback(); //有任何错误发生,回滚并取消执行结果
echo &#39;回滚&#39;;
}
$db->autocommit(true); //设置为非自动提交——事务处理
$db->close();
?>

Il existe deux méthodes principales de traitement des transactions dans MYSQL.

1. Utilisez start, rollback et commit pour implémenter
begin démarre une transaction
rollback transaction rollback
commit confirmation de transaction
2. Utilisez directement set pour changer le mode de soumission automatique de mysql
MYSQL soumet automatiquement par défaut, c'est-à-dire que si vous soumettez une REQUETE, elle sera exécutée directement ! Nous pouvons implémenter le traitement des transactions en
set autocommit=0 pour désactiver la soumission automatique
set autocommit=1 et activer la soumission automatique
.
Lorsque vous utilisez set autocommit=0, tous vos SQL ultérieurs seront traités comme des transactions jusqu'à ce que vous le confirmiez avec commit ou rollback.
Notez que lorsque vous terminez cette transaction, vous démarrez également une nouvelle transaction ! Selon la première méthode, seule celle en cours est utilisée comme transaction !
Je recommande personnellement d’utiliser la première méthode !
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 :
La méthode est la suivante :

1 Modifiez le fichier c:appservmysqlmy.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.
4. Lors de la création d'une table, vous pouvez sélectionner le moteur InnoDB pour le moteur de stockage. S'il s'agit d'une table créée précédemment, vous pouvez utiliser mysql->alter table table_name type=InnoDB;
ou mysql->alter table table_name engine=InnoDB; pour modifier le moteur de la table de données afin de prendre en charge les transactions.
*/

/*************** transaction--1 ***************/
$conn = mysql_connect(&#39;localhost&#39;,&#39;root&#39;,&#39;root&#39;) or die ("数据连接错误!!!");
mysql_select_db(&#39;test&#39;,$conn);
mysql_query("set names &#39;GBK&#39;"); //使用GBK中文编码;
//开始一个事务
mysql_query("BEGIN"); //或者mysql_query("START TRANSACTION");
$sql = "INSERT INTO `user` (`id`, `username`, `sex`) VALUES (NULL, &#39;test1&#39;, &#39;0&#39;)";
$sql2 = "INSERT INTO `user` (`did`, `username`, `sex`) VALUES (NULL, &#39;test1&#39;, &#39;0&#39;)";//这条我故意写错
$res = mysql_query($sql);
$res1 = mysql_query($sql2); 
if($res && $res1){
mysql_query("COMMIT");
echo &#39;提交成功。&#39;;
}else{
mysql_query("ROLLBACK");
echo &#39;数据回滚。&#39;;
}
mysql_query("END");
/**************** transaction--2 *******************/
/*方法二*/
mysql_query("SET AUTOCOMMIT=0"); //设置mysql不自动提交,需自行用commit语句提交
$sql = "INSERT INTO `user` (`id`, `username`, `sex`) VALUES (NULL, &#39;test1&#39;, &#39;0&#39;)";
$sql2 = "INSERT INTO `user` (`did`, `username`, `sex`) VALUES (NULL, &#39;test1&#39;, &#39;0&#39;)";//这条我故意写错
$res = mysql_query($sql);
$res1 = mysql_query($sql2); 
if($res && $res1){
mysql_query("COMMIT");
echo &#39;提交成功。&#39;;
}else{
mysql_query("ROLLBACK");
echo &#39;数据回滚。&#39;;
}
mysql_query("END"); //事务处理完时别忘记mysql_query("SET AUTOCOMMIT=1");自动提交
/******************对于不支持事务的MyISAM引擎数据库可以使用表锁定的方法:********************/
//MyISAM & InnoDB 都支持,
/*
LOCK TABLES可以锁定用于当前线程的表。如果表被其它线程锁定,则造成堵塞,直到可以获取所有锁定为止。
UNLOCK TABLES可以释放被当前线程保持的任何锁定。当线程发布另一个LOCK TABLES时,或当与服务器的连接被关闭时,所有由当前线程锁定的表被隐含地解锁。
*/
mysql_query("LOCK TABLES `user` WRITE");//锁住`user`表
$sql = "INSERT INTO `user` (`id`, `username`, `sex`) VALUES (NULL, &#39;test1&#39;, &#39;0&#39;)";
$res = mysql_query($sql);
if($res){
echo &#39;提交成功。!&#39;;
}else{
echo &#39;失败!&#39;;
}
mysql_query("UNLOCK TABLES");//解除锁定


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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer