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 トランザクションの関連操作を適切にカプセル化しています。以下の例:
$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();
}
$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を設定
トランザクションを開始
別の例を見てみましょう。
$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();
}
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 をサポートしていることを意味します) であることを確認します。
これは、トランザクショントランザクションがサポートされていることを意味します。