まず第一に、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(); }
2. 操作中に「services.msc」と入力して、mysql サービスを再起動します。
3. phpmyadmin、mysql->show エンジンに移動し (または、mysql->show 変数 ('have_%'; など) を実行)、InnoDB が YES (データベースが InnoDB をサポートしていることを意味します) であることを確認します。
これは、トランザクショントランザクションがサポートされていることを意味します。以上がPHP mysql と mysqli トランザクションの使用法と操作の比較の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。