ホームページ  >  記事  >  バックエンド開発  >  PHP mysql と mysqli トランザクションの使用法と操作の比較

PHP mysql と mysqli トランザクションの使用法と操作の比較

巴扎黑
巴扎黑オリジナル
2017-05-26 16:12:411559ブラウズ

まず第一に、mysqli 接続は永続的な接続ですが、mysql は非永続的な接続です。それはどういう意味ですか? mysql 接続が 2 回目に使用されるたびに、新しいプロセスが再度開かれますが、mysqli は同じプロセスのみを使用するため、Mysqli はトランザクションなどの一部の高度な操作を同時にカプセル化します。 、DB 操作プロセスで使用可能な多くのメソッドをカプセル化します。

最もよく使われるのはmysqliトランザクションです。

たとえば、次の例:

コードは次のとおりです:

$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();
}
PHP では、mysqli は mysql トランザクションの関連操作を適切にカプセル化しています。次の例:

コードは次のとおりです:

$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();
}

ここでは、php mysql 一連の関数を使用してトランザクションを実行します。


コードは次のとおりです:

$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);

ここで注意すべき点は、

MyISAM: トランザクションをサポートしておらず、パフォーマンスを向上させるために読み取り専用プログラムに使用されることです

InnoDB: ACID トランザクション、行レベルのロック、同時実行性をサポートしています

Berkeley DB: トランザクションをサポート
注意すべき点: MySQL のデフォルトの動作では、各 SQL ステートメントが実行された後に COMMIT ステートメントが実行され、各ステートメントを事実上個別のトランザクションとして扱います。

しかし、多くの場合、トランザクションを使用する必要がある場合、複数の SQL ステートメントを実行する必要があります。これには、MySQL の autocommit 属性を手動で 0 (デフォルトは 1) に設定する必要があります。

同時に、START TRANSACTION ステートメントを使用してトランザクションを明示的に開きます。上の例のように。

これを行わなかった場合、どのような結果が生じますか?

上記の 2 番目のコードのコメント //mysql_query(‘SET autocommit=0’); と // mysql_query($sql3); を削除して実行します。

現時点では、mysql_query($sql3) は実行時にデータベースに挿入されません。

コメント // mysql_query(‘SET autocommit=1’); を削除すると、mysql_query($sql3); が正常に実行されます。

通常、トランザクションは COMMIT または ROLLBACK ステートメントが実行されると完了しますが、一部の DDL ステートメントは暗黙的に COMMIT をトリガーします。例:

インデックスの削除

ドロッププロシージャ

テーブルのドロップ

テーブルのロック解除

マスターデータのロード

テーブルのロック
テーブルの名前変更
テーブルの切り捨て
SET AUTOCOMMIT=1
トランザクションの開始

別の例を見てみましょう。

コードは次のとおりです:

$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();
}

上記の例では、$sql2 の実行が失敗しても、$sql1 は引き続き実行されます。なぜ?

rename が実行されると、mysql はデフォルトで最初に commit を実行してから rename を実行するためです。

注意

トランザクション処理をサポートできるのは、MYSQL の INNODB および BDB タイプのデータ テーブルのみです。他のタイプはサポートされていません。

***: 通常、MYSQL データベースのデフォルトのエンジンは MyISAM です。このエンジンはトランザクションをサポートしません。 MYSQL でトランザクションをサポートしたい場合は、手動で変更できます:

方法は次のとおりです: 1. c:/appserv/mysql/my.ini ファイルを変更し、skip-InnoDB を見つけ、先頭に # を追加して保存します。ファイル。

2. 操作中に「services.msc」と入力して、mysql サービスを再起動します。

3. phpmyadmin、mysql->show エンジンに移動し (または、mysql->show 変数 ('have_%'; など) を実行)、InnoDB が YES (データベースが InnoDB をサポートしていることを意味します) であることを確認します。

これは、トランザクショントランザクションがサポートされていることを意味します。

以上がPHP mysql と mysqli トランザクションの使用法と操作の比較の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。