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

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

WBOY
WBOYオリジナル
2016-06-14 00:01:441038ブラウズ
PHP および MYSQL トランザクション処理

/*
MYSQL のトランザクション処理には主に 2 つの方法があります。
1. begin、rollback、commit を使用して
トランザクションを開始します
rollback トランザクションロールバック
commit トランザクション確認
2.直接 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 はインデックス ファイルとデータ ファイルを区別しません 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 タイプ (インデックス付き順次アクセス方式) に基づくデフォルトのタイプです。メソッド) の略で、他のストレージ エンジンと比較して、MyISAM テーブルのチェックと修復を行うためのツールのほとんどが、全文検索をサポートしています。トランザクションに対して安全ではなく、外部キーはサポートされていません。ロールバックすると不完全なロールバックが発生し、アトミックではありません。大量の SELECT を実行する場合は、MyISAM を選択することをお勧めします。

InnoDB: このタイプは BDB タイプと同じ特性を持ち、InnoDB テーブルも高速なので、トランザクションが必要な場合に安全です。データが大量の INSERT または UPDATE を実行する場合、パフォーマンス上の理由から、InnoDB テーブルを使用する必要があります。

サポートする InnoDB タイプの標準では、速度に影響します。主な理由は、AUTOCOMMIT のデフォルト設定がオンになっており、プログラムがトランザクションを開始するために BEGIN を明示的に呼び出していないため、挿入された項目ごとに自動的にコミットが行われ、速度に重大な影響を与えることです。 SQL を実行する前に begin を呼び出すと (自動コミットがオンになっている場合でも) 複数の SQL が 1 つのトランザクションを形成するため、パフォーマンスが大幅に向上します。

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

MySQL を使用する場合、InnoDB と MyISAM は最も一般的に使用される 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 テーブルはファイルの形式で保存されるため、小規模なアプリケーションには適しています。クロスプラットフォームのデータ転送に使用できます。 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 テーブルはテーブル全体 (テーブルの更新など) もロックします。 set num=1 where name like “%aaa%”

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

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


以下は、InnoDB と MyISAM の接続と相違点です。

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

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

2.1 トランザクションをサポートしていないテーブルでの開始/コミット操作は、コミットを実行する前に送信されています。
msyql を実行します。
存在する場合はテーブルを削除します tn;
テーブルを作成します tn (a varchar(10)) type=myisam;
存在する場合はテーブルを削除します ty;
テーブルを作成します (varchar(10)) type=innodb; 🎜>
begin;
tn 値に挿入('a');
tn から * を選択; 🎜> 両方 レコードを参照できます

別の mysql を実行します:
use test;
select * from ty;
tn のみがレコードを参照できます
> 次に、反対側の
commit;
でレコードを確認できます。

3. 次のコマンドを実行して、非トランザクション テーブルをトランザクションに切り替えることができます (データは失われません)。
alter table tablename type=innodb; 🎜>
3.1 innodb テーブルに対して修復テーブル コマンドと myisamchk -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) 内にある必要があります

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。