ホームページ > php教程 > php手册 > PHP および MYSQL トランザクション処理、PHPMYSQL トランザクション処理

PHP および MYSQL トランザクション処理、PHPMYSQL トランザクション処理

WBOY
リリース: 2016-07-06 14:25:32
オリジナル
924 人が閲覧しました

PHP と MYSQL のトランザクション処理、PHPMYSQL トランザクション処理

/*
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 を自動的に送信しないように設定します。必須 commit ステートメントを使用して自分で送信します
$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 にはテーブルをチェックおよび修復するためのツールがほとんどありますが、フルテキスト検索はサポートされておらず、トランザクション安全ではありません。キー。ロールバックすると不完全なロールバックが発生し、アトミックではありません。大量の SELECT を実行する場合は、MyISAM を選択することをお勧めします。

InnoDB: このタイプは BDB タイプと同じ特性を持ち、外部キーもサポートしているため、トランザクション セーフなストレージ エンジンが必要な場合に最適です。データが多数の INSERT または UPDATE を実行する場合は、パフォーマンス上の理由から、InnoDB テーブルを使用する必要があります。

速度に影響を与える主な理由は、InnoDB テーブルです。 AUTOCOMMIT の設定がオンになっており、プログラムがトランザクションを開始するために 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 は比較的シンプルなので、効率の点で InnoDB よりも優れています。

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 テーブルの行ロックは絶対的ではありません。MySQL が SQL ステートメントの実行時にスキャンする範囲を決定できない場合、InnoDB テーブルはテーブル全体もロックします (たとえば、テーブル セット num=1 を更新します)。 「%aaa %」のような名前

ビジネスの種類に応じて適切なテーブル タイプを選択することによってのみ、MySQL のパフォーマンス上の利点を最大化することができます。

=============================================== == ===============


InnoDB と MyISAM の接続と相違点を以下に示します。

1. Mysqld 4.0 以降は、最大以外のバージョンを含むトランザクションをサポートします。 3.23 では、トランザクションをサポートするには mysqld の最大バージョンが必要です。

2. テーブルの作成時にタイプを指定しない場合、デフォルトで myisam になり、トランザクションはサポートされません。
show create table tablename コマンドを使用すると、テーブル タイプを確認できます。

2.1 トランザクションをサポートしていないテーブルでの開始/コミット操作は、コミットを実行する前に実行されます。
テストを実行します。
テーブルが存在する場合はテーブルを作成します。 (a varchar (10)) type=myisam;
テーブルが存在する場合は削除します ty (a varchar(10)) type=innodb;
tn 値に挿入します('a'); ty 値に ('a');
select * from tn;
select * from ty;
別の mysql を実行します。
select * from tn; tn のみがレコードを確認できます
、その後、反対側で
コミットできます。誰もが記録を見ることができます。

3. 次のコマンドを実行して、非トランザクション テーブルをトランザクションに切り替えることができます (データは失われません)。
alter table tablename type=innodb; table コマンドと myisamchk は innodb テーブル -r table_name では使用できません
ただし、チェック テーブルと mysqlcheck [OPTIONS] データベース [テーブル] は使用できます

================== ============ =================================

の使用mysql の更新用の選択は 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;

例 3: (不明瞭な主キー、テーブル ロック)

SELECT * FROM products WHERE id<>'3' FOR UPDATE;

例 4: (不明瞭な主キー、テーブル ロック)

SELECT * FROM products WHERE id LIKE ' 3' FOR UPDATE;

注 1:
FOR UPDATE は InnoDB にのみ適用され、有効にするにはトランザクション ブロック (BEGIN/COMMIT) 内にある必要があります

関連ラベル:
php
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート