Heim  >  Artikel  >  Backend-Entwicklung  >  Einführung in die Implementierungsmethode von PHP-Transaktionen (Codebeispiel)

Einführung in die Implementierungsmethode von PHP-Transaktionen (Codebeispiel)

不言
不言nach vorne
2019-02-20 11:33:102908Durchsuche

Dieser Artikel bietet Ihnen eine Einführung in die Implementierungsmethode von PHP-Transaktionen (Codebeispiele). Ich hoffe, dass er für Sie hilfreich ist.

<?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();
?>

Es gibt zwei Hauptmethoden der Transaktionsverarbeitung in MYSQL.

1. Verwenden Sie begin, rollback und commit, um
begin startet eine Transaktion
rollback-Transaktions-Rollback
commit-Transaktionsbestätigung
2. Verwenden Sie set direkt, um den automatischen Übermittlungsmodus von MySQL zu ändern
MYSQL sendet standardmäßig automatisch, dh wenn Sie eine ABFRAGE senden, wird diese direkt ausgeführt! Wir können die Transaktionsverarbeitung implementieren, indem wir
autocommit=0 setzen, um die automatische Übermittlung zu deaktivieren
autocommit=1 setzen und die automatische Übermittlung aktivieren
.
Wenn Sie set autocommit=0 verwenden, werden alle Ihre nachfolgenden SQL-Anweisungen als Transaktionen verarbeitet, bis Sie sie mit Commit oder Rollback bestätigen.
Beachten Sie, dass Sie mit dem Beenden dieser Transaktion auch eine neue Transaktion starten! Bei der ersten Methode wird nur die aktuelle als Transaktion verwendet!
Ich persönlich empfehle die erste Methode!
Nur ​​Datentabellen vom Typ INNODB und BDB in MYSQL können die Transaktionsverarbeitung unterstützen! Andere Typen werden nicht unterstützt!
***: Im Allgemeinen ist die Standard-Engine der MYSQL-Datenbank MyISAM. Diese Engine unterstützt keine Transaktionen! Wenn Sie möchten, dass MYSQL Transaktionen unterstützt, können Sie es manuell ändern:
Die Methode ist wie folgt:

1. Ändern Sie die Datei c:appservmysqlmy.ini, suchen Sie „skip-InnoDB“, fügen Sie # vor, und speichern Sie die Datei.
2. Geben Sie während des Betriebs „services.msc“ ein, um den MySQL-Dienst neu zu starten.
3. Gehen Sie zu phpmyadmin, mysql->show-Engines (oder führen Sie mysql->show-Variablen wie „have_%“ aus) und überprüfen Sie InnoDB auf JA, was bedeutet, dass die Datenbank InnoDB unterstützt.
Das bedeutet, dass Transaktionstransaktionen unterstützt werden.
4. Beim Erstellen einer Tabelle können Sie die InnoDB-Engine für die Storage Engine auswählen. Wenn es sich um eine zuvor erstellte Tabelle handelt, können Sie mysql->alter table table_name type=InnoDB;
oder mysql->alter table table_name engine=InnoDB; verwenden, um die Engine der Datentabelle so zu ändern, dass Transaktionen unterstützt werden.
*/

/*************** 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");//解除锁定


Das obige ist der detaillierte Inhalt vonEinführung in die Implementierungsmethode von PHP-Transaktionen (Codebeispiel). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen