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

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

Jun 14, 2016 am 12:01 AM
mysql php コード オープンソース プログラミング プログラミング言語 ソフトウェア開発

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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

MySQL:初心者向けのデータ管理の容易さ MySQL:初心者向けのデータ管理の容易さ Apr 09, 2025 am 12:07 AM

MySQLは、インストールが簡単で、強力で管理しやすいため、初心者に適しています。 1.さまざまなオペレーティングシステムに適した、単純なインストールと構成。 2。データベースとテーブルの作成、挿入、クエリ、更新、削除などの基本操作をサポートします。 3.参加オペレーションやサブクエリなどの高度な機能を提供します。 4.インデックス、クエリの最適化、テーブルパーティション化により、パフォーマンスを改善できます。 5。データのセキュリティと一貫性を確保するために、バックアップ、リカバリ、セキュリティ対策をサポートします。

NAVICATでデータベースパスワードを取得できますか? NAVICATでデータベースパスワードを取得できますか? Apr 08, 2025 pm 09:51 PM

NAVICAT自体はデータベースパスワードを保存せず、暗号化されたパスワードのみを取得できます。解決策:1。パスワードマネージャーを確認します。 2。NAVICATの「パスワードを記憶する」機能を確認します。 3.データベースパスワードをリセットします。 4.データベース管理者に連絡してください。

Navicatプレミアムの作成方法 Navicatプレミアムの作成方法 Apr 09, 2025 am 07:09 AM

NAVICATプレミアムを使用してデータベースを作成します。データベースサーバーに接続し、接続パラメーターを入力します。サーバーを右クリックして、[データベースの作成]を選択します。新しいデータベースの名前と指定された文字セットと照合を入力します。新しいデータベースに接続し、オブジェクトブラウザにテーブルを作成します。テーブルを右クリックして、データを挿入してデータを挿入します。

javascriptの分解:それが何をするのか、なぜそれが重要なのか javascriptの分解:それが何をするのか、なぜそれが重要なのか Apr 09, 2025 am 12:07 AM

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

NavicatでMySQLへの新しい接続を作成する方法 NavicatでMySQLへの新しい接続を作成する方法 Apr 09, 2025 am 07:21 AM

手順に従って、NAVICATで新しいMySQL接続を作成できます。アプリケーションを開き、新しい接続(CTRL N)を選択します。接続タイプとして「mysql」を選択します。ホスト名/IPアドレス、ポート、ユーザー名、およびパスワードを入力します。 (オプション)Advanced Optionsを構成します。接続を保存して、接続名を入力します。

NAVICATでSQLを実行する方法 NAVICATでSQLを実行する方法 Apr 08, 2025 pm 11:42 PM

NAVICATでSQLを実行する手順:データベースに接続します。 SQLエディターウィンドウを作成します。 SQLクエリまたはスクリプトを書きます。 [実行]ボタンをクリックして、クエリまたはスクリプトを実行します。結果を表示します(クエリが実行された場合)。

NAVICATは、MySQL/Mariadb/PostgreSQLおよびその他のデータベースに接続できません NAVICATは、MySQL/Mariadb/PostgreSQLおよびその他のデータベースに接続できません Apr 08, 2025 pm 11:00 PM

NAVICATがデータベースとそのソリューションに接続できない一般的な理由:1。サーバーの実行ステータスを確認します。 2。接続情報を確認します。 3.ファイアウォール設定を調整します。 4.リモートアクセスを構成します。 5.ネットワークの問題のトラブルシューティング。 6.許可を確認します。 7.バージョンの互換性を確保します。 8。他の可能性のトラブルシューティング。

Navicatは、データベースエラーコードとソリューションに接続します Navicatは、データベースエラーコードとソリューションに接続します Apr 08, 2025 pm 11:06 PM

データベースに接続するときの一般的なエラーとソリューション:ユーザー名またはパスワード(エラー1045)ファイアウォールブロック接続(エラー2003)接続タイムアウト(エラー10060)ソケット接続を使用できません(エラー1042)SSL接続エラー(エラー10055)接続の試みが多すぎると、ホストがブロックされます(エラー1129)データベースは存在しません(エラー1049)

See all articles