ホームページ >バックエンド開発 >PHPチュートリアル >apache php mysql PHP および MYSQL トランザクション処理
/*
MYSQL のトランザクション処理には主に 2 つの方法があります。
1. begin、rollback、commit を使用して実装します
トランザクションの開始を開始します
rollback トランザクションのロールバック
コミットトランザクションの確認
2. set を直接使用して MySQL の自動送信モードを変更します
MYSQL はデフォルトで自動的に送信されます。クエリを送信すると、クエリが直接実行されます。
set autocommit=0 を使用して自動送信を無効にし、
set autocommit=1 を使用して自動送信を有効にし、
を使用してトランザクション処理を実装できます。
set autocommit=0 を使用すると、コミットまたはロールバックで確認するまで、後続のすべての SQL がトランザクションとして処理されます。
このトランザクションを終了すると、新しいトランザクションも開始されることに注意してください。最初の方法によれば、現在のものだけがトランザクションとして使用されます。
個人的には最初の方法を使用することをお勧めします。
MYSQL の INNODB および BDB タイプのデータ テーブルのみがトランザクション処理をサポートできます。他のタイプはサポートされていません。
***: 通常、MYSQL データベースのデフォルトのエンジンは MyISAM です。このエンジンはトランザクションをサポートしません。 MYSQL でトランザクションをサポートしたい場合は、手動で変更できます:
方法は次のとおりです: 1. c:appservmysqlmy.ini ファイルを変更し、skip-InnoDB を見つけて先頭に # を追加して、ファイルを保存します。
2. 操作中に「services.msc」と入力して、mysql サービスを再起動します。
3. phpmyadmin、mysql->show エンジンに移動し (または、mysql->show 変数 ('have_%'; など) を実行し、InnoDB が YES (データベースが InnoDB をサポートしていることを意味します) であることを確認します。
これは、トランザクショントランザクションがサポートされていることを意味します。
4. テーブルを作成するときに、ストレージ エンジンとして InnoDB エンジンを選択できます。以前に作成したテーブルの場合は、mysql->alter table table_name type=InnoDB; または mysql->alter table table_name Engine=InnoDB; を使用して、トランザクションをサポートするようにデータ テーブルのエンジンを変更できます。
*/
/*************** トランザクション--1 ***************/
$conn = mysql_connect('localhost','root','root') or die ("データ接続エラー!!!");
mysql_select_db('test', $conn);
mysql_query("set names 'GBK'"); //GBK 中国語エンコーディングを使用します;
//トランザクションを開始します
mysql_query("BEGIN") //または mysql_query("START TRANSACTION");
$ sql = "INSERT INTO `user` (`id`, `username`, `sex`) VALUES (NULL, 'test1', '0')";
$sql2 = "INSERT INTO `user` (`did`, `username`, `sex`) VALUES (NULL, 'test1', '0')";//意図的に間違って書きました
$res = mysql_query($sql);
$res1 = mysql_query($sql2);
if($res && $res1){
mysql_query("COMMIT");
echo '送信は成功しました。 ';
}else{
mysql_query("ROLLBACK");
echo 'データのロールバック。 ';
}
mysql_query("END");
/**************** トランザクション--2 *******************/
/*方法 2*/
mysql_query("SET AUTOCOMMIT=0"); //mysql を自動的に送信しないように設定する必要があります。自分で使用するには、ステートメントの送信をコミットします
$sql = "INSERT INTO `user` (`id`, `username`, `sex`) VALUES (NULL, 'test1', '0')";
$sql2 = "INSERT INTO `user` (`did`, `username`, `sex`) VALUES (NULL, 'test1', '0')";//これは意図的に間違って書きました
$res = mysql_query($sql);
$ res1 = mysql_query ($sql2);
if($res && $res1){
mysql_query("COMMIT");
echo '送信は成功しました。 ';
}else{
mysql_query("ROLLBACK");
echo 'データのロールバック。 ';
}
mysql_query("END"); //トランザクションが完了したら、mysql_query("SET AUTOCOMMIT=1") を忘れずに送信してください
/******************トランザクションをサポートしていない MyISAM エンジン データベースの場合は、テーブル ロック方式を使用できます。**************** *********/
//MyISAM & InnoDB がサポートされており、
/*
LOCK TABLES は現在のスレッドで使用されているテーブルをロックできます。テーブルが別のスレッドによってロックされている場合、すべてのロックが取得できるまでブロックが発生します。
UNLOCK TABLES は、現在のスレッドによって保持されているロックを解放します。スレッドが別の LOCK TABLES を発行するか、サーバーへの接続が閉じられると、現在のスレッドによってロックされているすべてのテーブルのロックが暗黙的に解除されます。
*/
mysql_query("LOCK TABLES `user` WRITE");//`user` テーブルをロックします
$sql = "INSERT INTO `user` (`id`, `username`, `sex`) VALUES (NULL) , 'test1', '0')";
$res = mysql_query($sql);
if($res){
echo '送信に成功しました。 !';
}else{
echo '失敗!';
}
mysql_query("UNLOCK TABLES");//ロック解除
MyISAM は MySQL のデフォルトのストレージ エンジンです。一般的に、このことを気にする人はあまりいません。どのストレージ エンジンを使用するかを決定するのは非常に難しいことですが、この 2 つは最も一般的なため、この記事では MyISAM と InnoDB についてのみ検討します。
最初にいくつかの質問に答えてみましょう:
◆データベースには外部キーがありますか?
◆取引サポートは必要ですか?
◆全文インデックスは必要ですか?
◆どのようなクエリパターンをよく使いますか?
◆データのサイズはどれくらいですか?
myisam はインデックス キャッシュのみを持ちます
innodb はインデックス ファイルとデータ ファイルを区別しません
myisam はインデックス データのみを管理できます。インデックス データが割り当てられたリソースよりも大きい場合、データ ファイルはオペレーティング システムによってキャッシュされます。オペレーティング システムのキャッシュ上。 Innodb はインデックスとデータの両方を独自に管理します
上記の質問について考えると、正しい方向を見つけるのに役立ちますが、それが絶対的なわけではありません。トランザクション処理や外部キーが必要な場合は、InnoDB の方が良い方法かもしれません。フルテキスト インデックスが必要な場合は、MyISAM がシステムに組み込まれているため、通常はこれが適切な選択となります。ただし、実際には 200 万行のレコードを頻繁にテストすることはありません。したがって、多少遅くても、Sphinx を使用して InnoDB からフルテキスト インデックスを取得できます。
データのサイズは、どのストレージ エンジンの選択に影響する重要な要素です。大規模なデータ セットでは、トランザクション処理と障害回復がサポートされているため、InnoDB が選択される傾向があります。データベースのサイズによって、InnoDB がデータ回復にトランザクション ログを使用できる時間が決まります。これにより、より高速になります。 MyISAM ではこれらの処理に数時間、場合によっては数日かかる場合がありますが、InnoDB では数分しかかかりません。
データベーステーブルを操作する習慣も、パフォーマンスに大きな影響を与える要因である可能性があります。例: COUNT() は MyISAM テーブルでは非常に高速ですが、InnoDB テーブルでは苦痛になる可能性があります。 InnoDB では主キー クエリは非常に高速ですが、主キーが長すぎるとパフォーマンスの問題が発生することに注意する必要があります。多数の挿入ステートメントは MyISAM で高速化されますが、更新は InnoDB で高速化されます (特に同時実行量が多い場合)。
さて、どれを使えばいいでしょうか?経験によれば、小規模なアプリケーションやプロジェクトの場合は、MyISAM の方が適している可能性があります。もちろん、大規模環境で MyISAM を使用すると非常にうまくいく場合もありますが、常にそうとは限りません。非常に大規模なデータ量のプロジェクトを使用する予定で、トランザクション処理または外部キーのサポートが必要な場合は、実際には InnoDB を直接使用する必要があります。ただし、InnoDB テーブルにはより多くのメモリとストレージが必要であり、100 GB の MyISAM テーブルを InnoDB テーブルに変換すると、非常に悪いエクスペリエンスが得られる可能性があることを覚えておく必要があります。
================================================ === ==========
MyISAM: これは、従来の ISAM タイプに基づいており、Indexed Sequential Access Method の略で、レコードとファイルを保存するために使用されます。標準的なアプローチ。他のストレージ エンジンと比較して、MyISAM にはテーブルをチェックおよび修復するためのツールがほとんどあります。MyISAM テーブルは、トランザクションに対して安全ではなく、外部キーをサポートしません。ロールバックすると不完全なロールバックが発生し、アトミックではありません。大量の SELECT を実行する場合は、MyISAM を選択することをお勧めします。
InnoDB: このタイプは BDB タイプと同じ特性を持ち、外部キーもサポートします。そのため、トランザクション セーフなストレージ エンジンが必要な場合に最適です。データが多数の INSERT または UPDATE を実行する場合、パフォーマンス上の理由から、InnoDB テーブルを使用する必要があります。速度に影響を与える主な理由は、InnoDB テーブルのデフォルト設定です。さらに、プログラムはトランザクションを開始するために BEGIN を明示的に呼び出していないため、挿入された項目ごとに自動的にコミットが行われ、速度に重大な影響を及ぼします。 SQL を実行する前に begin を呼び出すと (自動コミットがオンになっている場合でも) 複数の SQL が 1 つのトランザクションを形成するため、パフォーマンスが大幅に向上します。
================================================ === ==============
InnoDB と MyISAM は、MySQL を使用するときに最もよく使用される 2 つのテーブル タイプであり、それぞれには特定のアプリケーションに応じて、独自の長所と短所があります。参考までに、この 2 つの既知の違いを以下に示します。
innodb
InnoDB は、トランザクション (コミット)、ロールバック (ロールバック)、およびクラッシュ回復機能を備えたトランザクションセーフ (ACID 準拠) テーブルを MySQL に提供します。 InnoDB は、Oracle タイプと一貫した SELECT での行ロック (行レベルでのロック) と非ロック読み取りを提供します。これらの機能により、マルチユーザーの同時操作のパフォーマンスが向上します。 InnoDB の行レベルのロックは非常に小さなスペースに収まるため、InnoDB テーブルでロックをエスカレーションする必要はありません。 InnoDB は、外部キー制約 (FOREIGN KEY 制約) を提供する MySQL 上の最初のテーブル エンジンです。
InnoDB は大容量データベース システムを処理できるように設計されており、その CPU 使用率は他のディスク ベースのリレーショナル データベース エンジンに匹敵しません。技術的には、InnoDB は MySQL バックグラウンド上に配置された完全なデータベース システムであり、データとインデックスをキャッシュするためにメイン メモリ内に独自の専用バッファ プールを確立します。 InnoDB は、他のファイルとは異なり、データとインデックスをテーブルスペースに保存します。たとえば、MyISAM では、テーブルは個別のファイルに保存されます。 InnoDB テーブルのサイズは、オペレーティング システムのファイル サイズによってのみ制限されます。通常は 2 GB です。
InnoDB のすべてのテーブルは同じデータ ファイル ibdata1 に保存されます (複数のファイルまたは独立したテーブル スペース ファイルである場合もあります)。無料の解決策としては、データ ファイルをコピーして binlog をバックアップするか、を使用することが考えられます。 mysqldump。
MyISAM
MyISAM は MySQL のデフォルトのストレージ エンジンです。
各 MyISAM テーブルは 3 つのファイルに保存されます。 frm ファイルにはテーブル定義が保存されます。 データファイルはMYD(MYData)です。 インデックスファイルはMYI(MYIndex)の拡張子です。
MyISAM は比較的シンプルなので、小規模なアプリケーションでは MyISAM を使用するのが良い選択です。
MyISAM テーブルは、クロスプラットフォームのデータ転送でファイル形式で保存されます。問題
以下にいくつかの詳細と具体的な実装の違いを示します:
1.InnoDB は FULLTEXT 型のインデックスをサポートしません。
2. InnoDB はテーブル内の特定の行数を保存しません。つまり、テーブルから select count(*) を実行するとき、InnoDB はテーブル全体をスキャンして行数を計算する必要がありますが、MyISAM は単に読み取るだけです。保存された行を数えるだけです。 count(*) ステートメントに where 条件が含まれている場合、2 つのテーブルの操作は同じであることに注意してください。
3. タイプ AUTO_INCREMENT のフィールドの場合、InnoDB にはこのフィールドのみのインデックスが含まれている必要がありますが、MyISAM テーブルでは他のフィールドとの結合インデックスを確立できます。
4.DELETE FROM テーブルの場合、InnoDB はテーブルを再作成せず、行ごとに削除します。
5. LOAD TABLE FROM MASTER 操作は InnoDB では機能しません。解決策は、まず InnoDB テーブルを MyISAM テーブルに変更し、データをインポートした後に InnoDB テーブルに変更することです (外部キーなど)が使用されている場合、表は適用されません。
さらに、InnoDB テーブルの行ロックは絶対的ではありません。SQL ステートメントの実行時に MySQL がスキャンする範囲を決定できない場合、InnoDB テーブルはテーブル全体もロックします (たとえば、テーブル セット num=1 の場合)。 「%aaa% 」のような名前
ビジネスの種類に応じて適切なテーブル タイプを選択することによってのみ、MySQL のパフォーマンス上の利点を最大化することができます。
================================================ === ==============
InnoDB と MyISAM の接続と相違点を以下に示します。
1. Mysqld 4.0 以降は、最大以外のバージョンを含むトランザクションをサポートします。 3.23 では、トランザクションをサポートするには mysqld の最大バージョンが必要です。
2. テーブルの作成時にタイプが指定されていない場合は、デフォルトでトランザクションをサポートしない myisam になります。
show create table tablename コマンドを使用すると、テーブル タイプを確認できます。
2.1 トランザクションをサポートしていないテーブルでの開始/コミット操作は効果がありません。テスト:
msyql を実行します。
テーブルが存在する場合は削除します。
テーブル tn ( varchar(10)) type=myisam;
テーブルが存在する場合は削除します ty (a varchar(10)) type=innodb;
tn 値に挿入します;
select * from tn;
select * from ty;
別の mysql を実行します。
select * from tn;
select * from ty;レコード
に移動し、反対側で commit
してレコードを確認します。
3. 次のコマンドを実行して、非トランザクション テーブルをトランザクションに切り替えることができます (データは失われません)。
alter table tablename type=innodb;
3.1 Repair table コマンドと myisamchk - r table_name は innodb テーブルには使用できません
ただし、チェック テーブルと mysqlcheck [OPTIONS] データベース [テーブル] は使用できます
========================= ============ =============================
mysql での更新のための select の使用使用するには、InnoDb のトランザクション内に存在する必要があります。
選択の条件が異なり、行レベルのロックが使用されるかテーブルレベルのロックが使用されるかが異なります。
命令は http://www.neo.com.tw/archives/900 に転送されます
InnoDB のデフォルトは行レベル ロックであるため、MySQL は主キーが「明示的に」指定されている場合にのみ行ロックを実行します (ロックされた選択されたデータのみ) (例)、そうでない場合、MySQL はテーブル ロック (データ フォーム全体をロック) を実行します。
例:
id と name の 2 つのフィールドがあり、id が主キーであるフォーム製品があるとします。
例 1: (主キーを明示的に指定し、このデータがある場合、行ロック)
SELECT * FROM products WHERE id='3′ FOR UPDATE;
例 2: (そのようなデータが存在しない場合は、主キーを明示的に指定)データ、ロックなし)
SELECT * FROM products WHERE id='-1' FOR UPDATE;
例 2: (主キーなし、テーブル ロック)
SELECT * FROM products WHERE name='Mouse' FOR UPDATE; (主キーが不明、テーブルロック)
SELECT * FROM products WHERE id LIKE '3' FOR UPDATE;
例 4: (主キーが不明、テーブルロック)
SELECT * FROM products WHERE id LIKE '3' FOR UPDATE; ;
注 1:
FOR UPDATE は InnoDB にのみ適用され、有効にするにはトランザクション ブロック (BEGIN/COMMIT) 内にある必要があります