ホームページ >バックエンド開発 >PHPチュートリアル >PHP mysql と mysqli トランザクションの使用説明_PHP チュートリアル

PHP mysql と mysqli トランザクションの使用説明_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 17:06:34981ブラウズ

まず第一に、mysqli 接続は永続的な接続ですが、mysql は非永続的な接続です。それはどういう意味ですか? mysql 接続が 2 回目に使用されるたびに、新しいプロセスが再度開かれますが、mysqli は同じプロセスのみを使用するため、サーバー側の負荷が大幅に軽減されます。

Mysqli は、トランザクションなどのいくつかの高度な操作をカプセル化し、DB 操作プロセスで使用可能な多くのメソッドもカプセル化します。

多くのアプリケーションがある場所は、mysqli トランザクションです。

たとえば次の例:

コードは次のとおりです コードをコピー


$mysqli = new mysqli('localhost','root','','DB_Lib2Test');
$mysqli->autocommit(false);//物事を始める
$mysqli->クエリ($sql1);
$mysqli->クエリ($sql2);
if(!$mysqli->errno){
$mysqli->commit();
「ok」をエコーし​​ます;
}その他{
エコー「エラー」;
$mysqli->rollback();
}


PHP では、mysqli は mysql トランザクションの関連操作を適切にカプセル化しています。以下の例:

コードは次のとおりです コードをコピー

$sql1 = "ユーザー設定の更新 ScoreCount = ScoreCount +10 (ID= '123456')";
$sql2 = "ScoreDetail を更新 set FScore = 300、ID= '123456'";
$sql3 = "ScoreDetail ID,Score) 値 ('123456',60) に挿入";

$mysqli = new mysqli('localhost','root','','DB_Lib2Test');
$mysqli->autocommit(false) // トランザクションを開始します
$mysqli->クエリ($sql1);
$mysqli->クエリ($sql2);
if (!$mysqli->errno) {
$mysqli->commit();
「ok」をエコーし​​ます;
} その他 {
エコー「エラー」;
$mysqli->rollback();
}

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

コードは次のとおりです コードをコピー

$sql1 = "ユーザー設定の更新 ScoreCount = ScoreCount +10 (ID= '123456')";
$sql2 = "ScoreDetail を更新 set FScore = 300、ID= '123456'";
$sql3 = "ScoreDetail ID,Score) 値 ('123456',60) に挿入";

$conn = mysql_connect('localhost','root','');
mysql_select_db('DB_Lib2Test');
mysql_query('トランザクション開始');
//mysql_query('SET autocommit=0');

mysql_query($sql1);
mysql_query($sql2);
if (mysql_errno()) {
mysql_query('ロールバック');
エコー「エラー」;
} その他 {
mysql_query('コミット');
「ok」をエコーし​​ます;
}

// mysql_query('SET autocommit=1');
// mysql_query($sql3);


ここに注目してください

MyISAM: トランザクションをサポートせず、パフォーマンスを向上させるために読み取り専用プログラムに使用されます
InnoDB: ACID トランザクション、行レベルのロック、同時実行性をサポートします
Berkeley DB: トランザクションをサポートします
もう 1 つ注意すべき点: 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 をトリガーします。

例えば以下のような文章です

関数の変更
手順の変更
テーブルを変更する
始めましょう
データベースを作成します
関数を作成する
インデックスを作成する
手順を作成する
テーブルを作成する
データベースを削除
ドロップ機能
インデックスを削除
ドロップ手順
ドロップテーブル
テーブルのロックを解除します
マスターデータをロードします
テーブルをロックする
テーブルの名前を変更します
テーブルを切り捨てる
自動コミット = 1 を設定します
取引を開始する

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

コードは次のとおりです コードをコピー

$sql1 = 'テーブル ScoreDetail_new(id int) を作成';
$sql2 = 'テーブル ScoreDetail の名前を ScoreDetail_bak に変更';
$sql3 = 'テーブル ScoreDetail_new の名前を ScoreDetail に変更';

$mysqli = new mysqli('localhost','root','','DB_Lib2Test');
$mysqli->autocommit(false);//物事を始める
$mysqli->クエリ($sql1);
$mysqli->クエリ($sql2);
$mysqli->クエリ($sql3);
if (!$mysqli->errno) {
$mysqli->commit();
「ok」をエコーし​​ます;
} その他 {
エコー「エラー」;
$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 をサポートしていることを意味します) であることを確認します。
これは、トランザクション トランザクションがサポートされていることを意味します。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/630689.html技術記事まず、mysqli 接続は永続的な接続ですが、mysql は非永続的な接続です。それはどういう意味ですか? mysql 接続が 2 回目に使用されるたびに、新しいプロセスが再度開かれ、mysqli...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。