ホームページ  >  記事  >  バックエンド開発  >  PHP mysql および mysqli トランザクションの使用手順 Share_PHP チュートリアル

PHP mysql および mysqli トランザクションの使用手順 Share_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 14:59:11794ブラウズ

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 = "ScoreDetail ID,Score) 値に挿入 ('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 = "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('rollback');
echo 'err';
} else {
mysql_query('commit');
echo 「わかりました」;
}

// 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 をトリガーします。

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

関数の変更
プロシージャの変更
テーブルの変更
開始
データベースの作成
関数の作成
インデックスの作成
プロシージャの作成
テーブルの作成
データベースの削除
関数の削除
インデックスの削除
プロシージャの削除
テーブルをドロップ
テーブルのロックを解除
マスターデータをロード
ロックテーブル
テーブルの名前を変更
テーブルを切り詰め
AUTOCOMMIT=1を設定
トランザクションを開始

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

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

$sql1 = 'テーブル ScoreDetail_new(id int) を作成';
$sql2 = 'テーブル ScoreDetail の名前を ScoreDetail_bak に変更';
$sql3 = 'テーブルの名前を変更ScoreDetail_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 をサポートしていることを意味します) であることを確認します。
これは、トランザクショントランザクションがサポートされていることを意味します。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/328165.html技術記事 mysqli は、トランザクションなどの一部の高度な操作をカプセル化し、DB 操作プロセスで使用可能な多くのメソッドもカプセル化します。 最も広く使用されているのは、mysqli トランザクションです。 たとえば、次の例: ...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。