MySQLデータベーストランザクションおよびストレージエンジン
1つは、MySQLのことです
1.1トランザクションの概念
●トランザクションとは、データベース操作コマンドのグループを含むメカニズム、操作シーケンスであり、すべてのコマンド全体とともにシステムに操作要求を送信またはキャンセルします。つまり、このデータベースコマンドのグループは実行されるか、実行されません。
●トランザクションは、分離できない論理的な作業単位です。データベースシステムで並行操作を実行する場合、トランザクションは最小の制御単位です。
●トランザクションは、複数のユーザーが銀行、保険会社、証券取引システムなどのデータベースシステムを同時に操作しているシナリオに適しています。
●トランザクションは、トランザクションの整合性を通じてデータの整合性を保証します。
率直に言って、いわゆるトランザクション、それは一連の操作であり、これらの操作は実行されるか実行されないかのどちらかであり、分割できない作業単位です。
1.2トランザクションのACID特性
ACIDは、信頼性の高いデータベース管理システム(DBMS)のトランザクションの4つの特性である、原子性、一貫性、分離、および耐久性を指します。これらは、信頼できるデータベースが持つべきいくつかの特性です。
1.2.1アトミシティ
原子性:トランザクションを分割できない作業単位と呼び、トランザクション内の操作はすべて発生するか、発生しないかのいずれかです。
トランザクションは完全な操作であり、トランザクションの要素は切り離せません。
トランザクション内のすべての要素は、全体としてコミットまたはロールバックする必要があります。
トランザクションのいずれかの要素が失敗すると、トランザクション全体が失敗します。
1.2.1.1ケース
Aが100元をBに送金する場合、控除明細書を実行して提出するだけです。このとき、突然電源が切れた場合、A口座はすでに控除されていますが、B口座は増額を受けていません。人生で紛争を引き起こす。この場合、トランザクションが実行されるか実行されないかを確認するには、トランザクションのアトミック性が必要です。
1.2.2一貫性
一貫性:これは、データベースの整合性制約が、トランザクションの開始前およびトランザクションの終了後に破棄されていないことを意味します。。
トランザクションが完了すると、データは一貫性のある状態である必要があります。
トランザクションが開始される前は、データベースに保存されているデータは一貫性のある状態です。
進行中のトランザクションでは、データに一貫性のない状態が存在する可能性があります。
トランザクションが正常に完了すると、データを既知の一貫性のある状態に戻す必要があります。
1.2.2.1ケース
銀行振込の場合、取引が成功したか失敗したかに関係なく、取引後の表AとBの預金の合計額が取引実行前と同じであることを確認する必要があります。
1.2.3分離
分離:並行環境では、異なるトランザクションが同じデータを同時に操作する場合、各トランザクションには独自の完全なデータスペースがあります。
データを変更するすべての同時トランザクションは互いに分離されており、トランザクションは独立している必要があり、他のトランザクションに依存したり影響を与えたりしてはならないことを示しています。
データを変更するトランザクションは、同じデータを使用する別のトランザクションが開始する前、または同じデータを使用する別のトランザクションが終了した後にデータにアクセスできます。
1.2.3.1トランザクション間の相互作用
事务之间的相互影响分为四种,分别为:
(1)脏读:一个事务读取了另一个事务未提交的数据,而这个数据是有可能回滚的。
(2)不可重复读:一个事务内两个相同的查询却返回了不同数据。这是由于查询时系统中其他事务修改的提交而引起的。
(3)幻读:一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,另一个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,操作前一个事务的用户会发现表中还有没有修改的数据行,就好象发生了幻觉一样。
(4)丢失更新:两个事务同时读取同一条记录,A先修改记录,B也修改记录(B不知道A修改过),B提交数据后B的修改结果覆盖了A的修改结果。
1.2.3.2Mysqlとトランザクション分離レベル
(1) read uncommitted:读取尚未提交的数据:不解决脏读
(2) read committed:读取已经提交的数据:可以解决脏读
(3) repeatable read:重读读取:可以解决脏读和不可重复读---mysql默认的
(4) serializable:串行化:可以解决脏读不可重复读和虚读---相当于锁表
mysql默认的事务处理级别是repeatable read,而Oracle和SQL Server是read committed 。
(1)グローバルトランザクション分離レベルを照会する
show global variables like '%isolation%';
SELECT @@global.tx_isolation;
(2)セッショントランザクションの分離レベルを照会します(現在の接続に対してのみ有効)
show session variables like '%isolation%';
SELECT @@session.tx_isolation;
SELECT @@tx_isolation;
(3)グローバルトランザクション分離レベルを設定します
set global transaction isolation level read committed;
(4)セッショントランザクション分離レベルを設定します
set session transaction isolation level read committed;
1.2.4 持久性
永続性:トランザクションが完了した後、トランザクションによってデータベースに加えられた変更はデータベースに永続化され、ロールバックされません。
システムに障害が発生したかどうかを示し、トランザクション処理の結果は永続的です。
トランザクションがコミットされると、トランザクションの効果はデータベースに永続的に保持されます。
要約:トランザクション管理では、原子性が基盤であり、分離が手段であり、一貫性が目標であり、永続性が結果です。
1.3トランザクション制御ステートメント
BEGIN或START TRANSACTION:显式地开启一个事务。
COMMIT或COMMITWORK:提交事务,并使已对数据库进行的所有修改变为永久性的。
ROLLBACK或ROLLBACK WORK:回滚会结束用户的事务,并撤销正在进行的所有未提交的修改。
SAVEPOINT S1:使用 SAVEPOINT 允许在事务中创建一个回滚点,一个事务中可以有多SAVEPOINT;“S1”代表回滚点名称。
ROLLBACK TO [SAVEPOINT] S1:把事务回滚到标记点。
1.3.1ケース
#创建表
use xyw;
create table account (
id int(10) primary key not null,
name varchar(40),
money double
);
insert into account values(1,'A',1000);
insert into account values(2,'B',1000);
1.3.1.1コミットトランザクションのテスト
begin;
update account set money= money - 100 where name='A';
commit;
quit
mysql -u root -p
use xyw;
select * from account;
1.3.1.2テストロールバックトランザクション
begin;
update account set money= money + 100 where name='A';
rollback;
quit
mysql -u root -p
use xyw;
select * from account;
1.3.1.3マルチポイントロールバックのテスト
begin; .
update account set money= money + 100 where name='A';
SAVEPOINT S1;
update account set money= money + 100 where name='B';
SAVEPOINT S2;
insert into account values(3,'C',1200);
select * from account;
ROLLBACK TO S1;
select * from account;
1.4設定を使用してトランザクションを制御する
SET AUTOCOMMIT=0; #禁止自动提交
SET AUTOCOMMIT=1; #开启自动提交,Mysq1默认为1
SHOW VARIABLES LIKE 'AUTOCOMMIT'; #查看Mysql中的AUTOCOMMIT值
自動コミットがオンになっていない場合、現在のセッションに接続されているmysqlのすべての操作は、ロールバックまたはコミットを入力するまでトランザクションとして扱われます。現在のトランザクションは終了したと見なされます。現在のトランザクションが終了する前に、新しいmysql接続は現在のセッションの操作結果を読み取ることができません。
自動コミットがオンになっている場合、mysqlは各SQLステートメントをトランザクションとして扱い、自動的にコミットします。
もちろん、オンになっているかどうかに関係なく、begin; commit | rollback;はすべて独立した問題です。
第二に、ストレージエンジン
2.1コンセプトの紹介
定義:MySQLのデータは、さまざまなテクノロジーを使用してファイルに保存されます。各テクノロジーは、さまざまなストレージメカニズム、インデックス作成技術、ロックレベルを使用し、最終的にはさまざまな機能と機能、これらのさまざまなテクノロジーとサポート機能を提供します。 MySQL。
ストレージエンジンは、ファイルシステムにデータを保存するMySQLのストレージ方法またはストレージ形式です。
2.2MySQLで一般的に使用されるストレージエンジン
MySQLで一般的に使用されるストレージエンジン
●MyISAM
●InnoDBMySQL
データベースコンポーネント。実際のデータI / O操作を実行し
ます。MySQLシステムでは、ストレージエンジンはファイルシステム上にあります。データは、ストレージエンジンに転送される前に転送されます。データファイルに保存されます。各ストレージエンジンのストレージ形式に従って保存します。
3、MyISAM
3.1MyISAMの機能の紹介
1. MyISAMは、トランザクションまたは外部キー制約をサポートしていません。フルテキストインデックスのみをサポートしています。データファイルとインデックスファイルは別々に保存されます。
アクセス速度は速く、トランザクションの整合性は必要ありません
。2.MyISAMはクエリに適しています。および挿入ベースのアプリケーション
MyISAM在磁盘上存储成三个文件,文件名和表名都相同,但是扩展名分别为
.frm文件存储表结构的定义
数据文件的扩展名为.MYD (MYData)
索引文件的扩展名是.MYI (MYIndex)
3.テーブルレベルのロックモード。データが更新されると、テーブル全体がロックされます。
4.データベースは、読み取りと書き込みの過程で相互にブロックします
会在数据写入的过程阻塞用户数据的读取
也会在数据读取的过程中阻塞用户的数据写入
5.データは個別に書き込まれるか読み取られ、速度が速く、リソースが比較的小さい
。6.MyIAMでサポートされているストレージ形式
静态表
动态表
压缩表
3.2MyISAMテーブルは3つの異なるストレージフォーマットをサポートします
(1)静的(固定長)テーブル
静的テーブルはデフォルトのストレージ形式です。静的テーブルのフィールドはすべて非可変フィールドであるため、各レコードの長さは固定されています。
このストレージ方式の利点は、ストレージが非常に高速で、キャッシュが容易で、障害からの回復が容易なことです。
欠点は、通常、動的テーブルよりも多くのスペースを占有することです。
(2)動的テーブル
動的テーブルには可変フィールドが含まれており、レコードは固定長ではありません。
このようなストレージの利点は、使用するスペースが少ないことですが、レコードを頻繁に更新および削除すると断片化が発生します。パフォーマンスを向上させるには、OPTIMIZETABLEステートメントまたはmyisamchk-rコマンドを定期的に実行する必要があり、次の場合に回復するのは比較的困難です。障害が発生します。
(3)圧縮テーブル
圧縮テーブルはmyisamchkツールによって作成され、非常に小さなスペースを占有します。各レコードは個別に圧縮されるため、アクセス費用はごくわずかです。
3.3MyISAMに適用可能な本番シナリオの例
1、ビジネストランザクションはサポートする必要はありません
2、一方的にデータの読み取りまたは書き込みを行うビジネス
3、MyISAMストレージエンジンのデータの読み取りと書き込みは
、比較的低い書き込みの同時アクセスビジネスを使用するより頻繁なシーン4には適していません
5、比較的データの変更がほとんど
ない
6.非常に高いデータサービスの一貫性を必要としないサービス7.サーバーのハードウェアリソースが比較的少ない
4、InnoDB
4.1InnoDB機能の概要
1.トランザクションをサポートし
、バージョン5.5.5以降のMySQLの4つのトランザクション分離レベルをサポートします。デフォルトのストレージエンジンはInnoDBです
。2。読み取りと書き込みのブロックはトランザクション分離レベルに関連しています。3 。
インデックスとデータを非常に効率的にキャッシュできます
。4。テーブルとプライマリキークラスターに
格納5.oracleデータベースと同様にパーティションとテーブルスペースを
サポート6.外部キー制約をサポート。5.5より前はフルテキストインデックスがサポートされていません。5.5以降はフルテキストインデックスがサポートされています
。7。ハードウェアリソース要件の場合まだ比較的高い
8。行レベルはロックされていますが、テーブル全体のスキャンは、次のようなテーブルレベルのロックのままです。
update table set a=1 where user like "%zhang%";
9、InnoDB中不保存表的行数,如'select count(*) from table;'时InnoDB需要扫描一遍整个表来计算有多少行,
但是MyISAM只要简单的读出保存好的行数即可。需要注意的是当count(*)语句包含where条件时MyISAM也需要扫描整个表
10.自己成長フィールドの場合、InnoDBにはフィールドのインデックスのみが含まれている必要がありますが、MyISAMテーブル内の他のフィールドと複合インデックスを作成できます
。11。テーブル全体がクリアされると、InnoDBは行ごとに削除します。非常に遅い。MyISAMはテーブルを再構築します
4.2InnoDBの適用可能な本番シナリオ分析
1.ビジネスにはトランザクションサポートが必要です
2.行レベルのロックは高い同時実行性にうまく適応できますが、クエリがインデックスを介して完了するようにする必要があります
3.ビジネスデータが頻繁に更新されるシナリオ(フォーラム、Weibo、など
のビジネスバンキング:4.ビジネスデータの一貫性の要件は、次のような、高い
5.ハードウェアデバイスは、メモリの使用率を改善し、ディスクIOの圧力を減らすためにはInnoDBのより良いキャッシュ機能を使用し、大容量のメモリを持っています
4.3ストレージエンジンのエンタープライズ選択の基礎
1.各ストレージエンジンが提供するさまざまなコア機能とアプリケーションシナリオを検討する必要があります
。2。サポートされるフィールドとデータ型
(1)すべてのエンジン|共通のデータ型をサポートします
(2)が、すべてのエンジンがバイナリオブジェクトなどの他のフィールドタイプをサポートするわけではありません
3.ロックタイプ:さまざまなストレージエンジンがさまざまなレベルのロックをサポートします
テーブルロック:MyISAMサポート
行ロック:InnoDBサポート
4.インデックスのサポート
インデックス作成により、データベース内のデータを検索および復元する際のパフォーマンスが大幅に向上します。
ストレージエンジンが異なれば、インデックス作成の手法
も異なります。一部のストレージエンジンは、インデックスをまったくサポートしていません。
5.トランザクション処理のサポート
テーブルの情報を更新および挿入する際の信頼性を向上させます。
ストレージエンジンは、エンタープライズビジネスがトランザクションをサポートする必要があるかどうかに応じて選択できます。
(1)システムでサポートされているストレージエンジンを表示する
show engines;
(2)テーブルで使用されているストレージエンジンを表示する
方法1:
show table status from 库名 where name='表名'\G
方法2:
use 库名;
show create table 表名;
(3)ストレージエンジンを変更する
方法一:通过alter table修改
use 库名;
alter table 表名 engine=MyISAM;
方法二:通过修改/etc/my.cnf 配置文件,指定默认存储引擎并重启服务
vim /etc/my.cnf
[mysqld]
default-storage-engine=INNODB
systemctl restart mysql.service
注意:此方法只对修改了配置文件并重启mysql服务后新创建的表有效,已经存在的表不会有变更。
方法三:通过create table 创建表时指定存储引擎
use 库名;
create table 表名 (字段1 数据类型,...) engine=MyISAM;