ホームページ 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衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

session_start()関数の重要性は何ですか? session_start()関数の重要性は何ですか? May 03, 2025 am 12:18 AM

session_start()iscrucialinphpformangingusersions.1)itInitiateSanewsessionifnoneExists、2)resumesanexistingsession、および3)SetSessionCookieforcontinuityAcrossRequests、ApplicationslicationSliviseSlikeUserauthicationAnticatent。

フィールドをMySQLテーブルに追加および削除する手順 フィールドをMySQLテーブルに追加および削除する手順 Apr 29, 2025 pm 04:15 PM

MySQLでは、AlterTabletable_nameaddcolumnnew_columnvarchar(255)afterexisting_columnを使用してフィールドを追加し、andtabletable_namedopcolumncolumn_to_dropを使用してフィールドを削除します。フィールドを追加するときは、クエリのパフォーマンスとデータ構造を最適化する場所を指定する必要があります。フィールドを削除する前に、操作が不可逆的であることを確認する必要があります。オンラインDDL、バックアップデータ、テスト環境、および低負荷期間を使用したテーブル構造の変更は、パフォーマンスの最適化とベストプラクティスです。

データ処理と計算にMySQL関数を使用する方法 データ処理と計算にMySQL関数を使用する方法 Apr 29, 2025 pm 04:21 PM

MySQL関数は、データ処理と計算に使用できます。 1.基本的な使用には、文字列処理、日付計算、数学操作が含まれます。 2。高度な使用法には、複数の関数を組み合わせて複雑な操作を実装することが含まれます。 3.パフォーマンスの最適化では、Where句での機能の使用を回避し、GroupByおよび一時テーブルを使用する必要があります。

MySQLをアンインストールし、残留ファイルをクリーンする方法 MySQLをアンインストールし、残留ファイルをクリーンする方法 Apr 29, 2025 pm 04:03 PM

安全かつ徹底的にMySQLをアンインストールし、すべての残留ファイルをクリーンにするには、次の手順に従ってください。1。MySQLサービスを停止します。 2。MySQLパッケージをアンインストールします。 3.構成ファイルとデータディレクトリのクリーン。 4.アンインストールが徹底していることを確認します。

MACOSシステム上のMySQLのインストール手順の詳細な説明 MACOSシステム上のMySQLのインストール手順の詳細な説明 Apr 29, 2025 pm 03:36 PM

MASQLのインストールは、次の手順で実現できます。1。コマンド/bin/bash-c"$(curl-fsslhttps://raw.githubusercontent.com/homebrew/install/head/install.sh)を使用して、Homebrewをインストールします。 2. Homebrewを更新し、Brewupdateを使用します。 3. mysqlをインストールし、Br​​ewinstallmysqlを使用します。 4. mysqlサービスを開始し、Brewservicesstartmysqlを使用します。インストール後、MySQL-Uを使用できます

MySQLにデータを挿入する効率的な方法 MySQLにデータを挿入する効率的な方法 Apr 29, 2025 pm 04:18 PM

MySQLでデータを挿入するための効率的な方法には、次のものが含まれます。1。insertInto ...値構文、2。LoadDatainFileコマンドの使用、3。トランザクション処理の使用、4。バッチサイズの調整、5。Insurtignoreまたは挿入の使用...

作曲家:PHP開発者のパッケージマネージャー 作曲家:PHP開発者のパッケージマネージャー May 02, 2025 am 12:23 AM

Composerは、PHPの依存関係管理ツールであり、Composer.jsonファイルを介してプロジェクトの依存関係を管理しています。 1)依存関係情報を取得するためのComposer.jsonを解析する。 2)依存関係を解析して、依存性ツリーを形成します。 3)PackagistからVendorディレクトリへの依存関係をダウンロードしてインストールします。 4)Composer.Lockファイルを生成して、依存関係バージョンをロックして、チームの一貫性とプロジェクトの保守性を確保します。

他のリレーショナルデータベースでMySQLを使用することの利点は何ですか? 他のリレーショナルデータベースでMySQLを使用することの利点は何ですか? May 01, 2025 am 12:18 AM

MySQLがさまざまなプロジェクトで広く使用されている理由には、次のものがあります。1。複数のストレージエンジンをサポートする高性能とスケーラビリティ。 2。使いやすく、メンテナンス、シンプルな構成とリッチツール。 3。豊富なエコシステム、多数のコミュニティとサードパーティのツールサポートを魅了します。 4。複数のオペレーティングシステムに適したクロスプラットフォームサポート。

See all articles