検索
ホームページphp教程php手册PHP および MYSQL トランザクション処理
PHP および MYSQL トランザクション処理Jun 14, 2016 am 12:01 AM
mysqlphpコードオープンソースプログラミングプログラミング言語ソフトウェア開発

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 までご連絡ください。
php怎么把负数转为正整数php怎么把负数转为正整数Apr 19, 2022 pm 08:59 PM

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

php怎么实现几秒后执行一个函数php怎么实现几秒后执行一个函数Apr 24, 2022 pm 01:12 PM

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php字符串有没有下标php字符串有没有下标Apr 24, 2022 am 11:49 AM

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php怎么除以100保留两位小数php怎么除以100保留两位小数Apr 22, 2022 pm 06:23 PM

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

php怎么读取字符串后几个字符php怎么读取字符串后几个字符Apr 22, 2022 pm 08:31 PM

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

php怎么根据年月日判断是一年的第几天php怎么根据年月日判断是一年的第几天Apr 22, 2022 pm 05:02 PM

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

php怎么替换nbsp空格符php怎么替换nbsp空格符Apr 24, 2022 pm 02:55 PM

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\&nbsp\;||\xc2\xa0)/","其他字符",$str)”语句。

php怎么查找字符串是第几位php怎么查找字符串是第几位Apr 22, 2022 pm 06:48 PM

查找方法:1、用strpos(),语法“strpos("字符串值","查找子串")+1”;2、用stripos(),语法“strpos("字符串值","查找子串")+1”。因为字符串是从0开始计数的,因此两个函数获取的位置需要进行加1处理。

See all articles

ホット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ヘンタイを無料で生成します。

ホットツール

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境