目次
PHP と MYSQL のトランザクション処理、PHPMYSQL トランザクション処理
ホームページ バックエンド開発 PHPチュートリアル PHP および MYSQL トランザクション処理、PHPMYSQL トランザクション処理_PHP チュートリアル

PHP および MYSQL トランザクション処理、PHPMYSQL トランザクション処理_PHP チュートリアル

Jul 12, 2016 am 08:50 AM
php

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) 内にある必要があります

http://www.bkjia.com/PHPjc/1133566.html

本当http://www.bkjia.com/PHPjc/1133566.html技術記事 PHP および MYSQL のトランザクション処理、PHPMYSQL トランザクション処理/* MYSQL のトランザクション処理には主に 2 つの方法があります。 1. begin、rollback、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)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

今まで知らなかったことを後悔している 7 つの PHP 関数 今まで知らなかったことを後悔している 7 つの PHP 関数 Nov 13, 2024 am 09:42 AM

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? Apr 03, 2025 am 12:03 AM

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

See all articles