MySQLトランザクションおよびストレージエンジン

1つはMySQLトランザクション

1.事務の概念

(1)トランザクションは、データベース操作コマンドのグループを含むメカニズム、操作シーケンスであり、すべてのコマンドは全体としてシステムに送信またはキャンセルされます。つまり、このデータベースコマンドのグループは実行されるか、まったく実行されません。実施した。
(2)トランザクションは、分離できない論理的な作業単位であり、データベースシステムで並行操作が実行される場合、トランザクションは最小の制御単位です。
(3)トランザクションは、複数のユーザーが銀行、保険会社、証券取引システムなどのデータベースシステムを同時に操作しているシナリオに適しています。
(4)トランザクションは、トランザクションの整合性を通じてデータの整合性を保証します。

2.トランザクションのACID特性

注:ACIDは、信頼性の高いデータベース管理システム(DBMS)のトランザクションの4つの特性(原子性、一貫性、分離、耐久性)を指します。これらは、信頼できるデータベースが持つべきいくつかの特性です。
(1)原子性:トランザクションを分割できない作業単位と呼び、トランザクション内の操作はすべて発生するか、発生しないかのいずれかです。
a。トランザクションは完全な操作であり、トランザクションの要素は切り離せません。
b。トランザクション内のすべての要素は、全体としてコミットまたはロールバックする必要があります。
c。トランザクションのいずれかの要素が失敗すると、トランザクション全体が失敗します。
(2)整合性:トランザクションの開始前とトランザクションの終了後に、データベースの整合性制約が破棄されないことを意味します。
a。トランザクションが完了すると、データは一貫性のある状態である必要があります。
b。トランザクションが開始される前は、データベースに保存されているデータは一貫性のある状態です。
c。進行中のトランザクションでは、データに一貫性のない状態が存在する可能性があります。
d。トランザクションが正常に完了したら、データを既知の一貫性のある状態に再度戻す必要があります。
(3)分離:並行環境では、異なるトランザクションが同じデータを同時に操作する場合、各トランザクションには独自の完全なデータスペースがあります。
データを変更するすべての同時トランザクションは互いに分離されており、トランザクションは独立している必要があり、他のトランザクションに依存したり影響を与えたりしてはならないことを示しています。
データを変更するトランザクションは、同じデータを使用する別のトランザクションが開始する前、または同じデータを使用する別のトランザクションが終了した後にデータにアクセスできます。
(4)永続性:トランザクションが完了した後、トランザクションによってデータベースに加えられた変更はデータベースに永続化され、ロールバックされません。
a。これは、システムに障害が発生したかどうかに関係なく、トランザクション処理の結果が永続的であることを意味します。
b。トランザクションがコミットされると、トランザクションの効果はデータベースに永続的に保持されます。
概要:トランザクション管理では、原子性が基盤であり、分離が手段であり、一貫性が目標であり、永続性が結果です。

3.物事間の相互作用

分類
(1)、ダーティ読み取り:トランザクションは別のトランザクションのコミットされていないデータを読み取り、このデータはロールバックされる場合があります。
(2)繰り返し不可の読み取り:トランザクション内の2つの同一のクエリは、異なるデータを返します。これは、クエリ中にシステム内の他のトランザクション変更がコミットされたことが原因です。
(3)、ファントム読み取り:トランザクションはテーブル内のデータを変更します。この変更には、テーブル内のすべてのデータ行が含まれます。同時に、別のトランザクションもこのテーブルのデータを変更します。この変更は、データの新しい行をテーブルに挿入することです。次に、前のトランザクションを操作しているユーザーは、錯覚が発生したかのように、テーブルに変更されていないデータ行がまだあることに気付きます。
(4)更新の喪失:2つのトランザクションが同じレコードを同時に読み取ります。最初にレコードを変更し、Bもレコードを変更します(BはAがレコードを変更したことを知りません)。Bがデータを送信すると、変更結果が表示されます。 BのはAの変更結果を上書きします。

4.Mysqlとトランザクション分離レベル

(1)、コミットされていない読み取り:コミットされていないデータを読み取り、ダーティ読み取りを解決しない
(2)、コミットされた読み取り:送信されたデータを
読み取り、ダーティ読み取りを解決できる(3)、繰り返し可能な読み取り:読み取りを再読み取り、解決できるダーティ読み取りと繰り返し不可読み取り------------- mysqlデフォルト
(4)、シリアル化可能:シリアル化、ダーティ読み取り、繰り返し不可能な読み取り、仮想読み取りを解決できます--------- ----- -ロックテーブルと同等
注:MySQLのデフォルトのトランザクション処理レベルは繰り返し可能な読み取りですが、Oracleと
ここに画像の説明を挿入
SQLServerはグローバルトランザクション分離レベルクエリするために読み取りコミットされます。

show global variables like '%isolation%';
SELECT @@global.tx_isolation;

クエリセッショントランザクション分離レベル:

show session variables like '%isolation%';
SELECT @@session.tx_isolation;
SELECT @@tx_isolation;

グローバルトランザクション分離レベルを設定します。

set global transaction isolation level read committed;

セッショントランザクション分離レベルを設定します。

set session transaction isolation level read committed;

5.トランザクション制御ステートメント

BEGIN 或 START TRANSACTION:显式地开启一个事务。
COMMIT 或 COMMITWORK:提交事务,并使已对数据库进行的所有修改变为永久性的。
ROLLBACK 或 ROLLBACKWORK:回滚回结束用户的事务,并撤销正在进行的所有未提交的修改。
SAVEPOINT S1:使用 SAVEPOINT 允许在事务中创建一个回滚点, 一个事务中可以有多个SAVEPOINT;“S1"代表回滚点名称。
ROLLBACK TO [SAVEPOINT] S1:把事务回滚到标记点。

例:

use edg;
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);

#测试提交事务
begin;
update account set money= money - 1000000 where name='A';
commit;
quit

mysql -u root -p
use edg;
select * from account;

#测试回滚事务
begin;
update account set money= money + 1000000 where name='A';
rollback;
mysql -u root -P
use edg;
select * from account;

#测试多点回滚
begin;
update account set money= money + 1000000 where name='A';
SAVEPOINT S1;
update account set money= money + 1000000 where name='B';
SAVEPOINT S2;
insert into account values(3,'C',1000);

select * from account;
ROLLBACK TO S1;
select * from account

6. setを使用して、制御トランザクションを設定します

SET AUTOCOMMIT=0;      #禁止自动提交
SET AUTOCOMMIT=1;      #开启自动提交,Mysql默认为1
SHOW VARIABLES LIKE 'AUTOCOMMIT';    #查看Mysql中的AUTOCOMMIT值

如果没有开启自动提交,当前会话连接的mysq1的所有操作都会当成一个事务直到你输入 rollback I commit; 当前事务才算结束。
当前事务结束前新的mysql连接时无法读取到任何当前会话的操作结果。
如果开起了自动提交,mysql 会把每个sql语句当成一个事务,然后自动的commit。
当然无论开启与否,begin; commit lrollback; 都是独立的事务。

2、MySQLストレージエンジン

1.ストレージエンジンの概念の概要

(1)MySQLのデータは、さまざまなテクノロジーを使用してファイルに保存されます。各テクノロジーは、さまざまなストレージメカニズム、インデックス作成手法、およびロックレベルを使用し、最終的にはさまざまな機能と機能を提供します。これらのさまざまなテクノロジーとサポート機能MySQLではストレージエンジンと呼ばれます。
(2)ストレージエンジンは、ファイルシステムにデータを格納するMySQLのストレージ方法またはストレージ形式です。
(3)MySQLで一般的に使用されるストレージエンジンは次
のとおりです。a、MylSAM
b、InnoDB
(4)実際のデータの実行を担当するMySQLデータベースコンポーネントI / O操作
(5)MySQLシステムでは、ストレージエンジンはファイルシステムの上にあり、データはデータファイルに保存される前にストレージエンジンに転送され、各ストレージエンジンのストレージ形式に従って保存されます。

2.MyISAMの機能の紹介

(1)MyISAMは、トランザクションまたは外部キー制約をサポートしていません。フルテキストインデックスのみをサポートしています。データファイルとインデックスファイルは別々に保存されます。
(2)アクセス速度が速く、トランザクションの整合性は必要ありません。
(3) MyISAMはクエリと挿入に適していますメインアプリケーション
(4)MylSAMはディスク上の3つのファイルに保存され、ファイル名とテーブル名は同じですが、拡張子は次のとおりです。a、frm
ファイルストレージテーブル構造定義
b、拡張子データファイルの.MYD(MYData)
c。インデックスファイルの拡張子は.MYI(MYIndex)
(5)テーブルレベルのロック形式で、データが更新されるとテーブル全体がロックされ
ます(6)データベースはそれぞれをブロックしますその他の読み取りと書き込みの過程で
a。ブロックユーザーデータの読み取りをデータ書き込みの過程で
B、読み取りデータ
7の間にユーザーデータの書き込みをブロックし、データの書き込みまたは読み取りを個別に行うと、処理速度が速くなり、比較的小さいフットプリント
8、
静的テーブル
b、動的テーブル
c、圧縮テーブルでサポートされるMyIAMストレージ形式
注:
静的テーブル(固定長):静的テーブルがデフォルトのストレージ形式です。静的テーブルのフィールドはすべて非可変フィールドであるため、各レコードの長さは固定されています。このストレージ方法の利点は、ストレージが非常に高速で、キャッシュが簡単で、障害からの回復が容易なことです。欠点は、通常、動的テーブルよりも多くのスペースを占有します。
動的テーブル:動的テーブルには可変フィールドが含まれ、レコードは固定長ではありません。このストレージの利点は、占有するスペースが少ないことですが、レコードを頻繁に更新および削除するとフラグメントが生成されます。OPTIMIZETABLEを実行する必要があります。ステートメントまたはmyisamchk-rコマンドを定期的に実行してパフォーマンスを向上させます。また、障害が発生したときに回復することは比較的困難です。
圧縮テーブル:圧縮テーブルはmyisamchkツールによって作成され、非常に小さなスペースを占有します。各レコードは個別に圧縮されるため、アクセスコストはごくわずかです。

3.MyISAMに適用可能な本番シナリオの例

(1)会社のビジネスはトランザクションサポートを必要としません
(2)一方的に多くのデータを読み書きするビジネス
(3)MylSAMストレージエンジンのデータの読み取りと書き込みは頻繁に行われ、書き込みシナリオは適切ではありません
(4)読み取りと書き込みを同時に使用しますアクセスが
比較的少ないビジネス(5)データの変更比較的少ないビジネス
(6)データの整合性要件がそれほど高くないビジネス
(7)サーバーハードウェアリソースが比較的少ない

4.InnoDB機能の紹介

(1)トランザクションをサポートし、4つのトランザクション分離レベルをサポートします
(2)MySQLはバージョン5.5.5から始まり、デフォルトのストレージエンジンはInnoDBです
(3)読み取りと書き込みのブロックはトランザクション分離レベルに関連しています
(4)インデックスとキャッシュを非常にキャッシュできます効率的にデータ
(5)テーブルと主キーはクラスターに格納されます
(6)oracleデータベースと同様にパーティションとテーブルスペースを
サポートします(7)外部キー制約をサポートします。5.5より前はフルテキストインデックスはサポートされません。5.5以降はフルです。 -テキストインデックスがサポートされています
(8)ハードウェアリソースの場合要件は依然として比較的高いです
(9)行レベルのロックですが、全表スキャンは引き続きテーブルレベルのロックになります。

update table set a=1 where user like '%yun%';

(10)InnoDBは、テーブルからのselect count(など、テーブル内の行数を保存しません。InnoDBは、テーブル全体をスキャンして行数を計算する必要がありますが、MyISAMは保存された行数を読み取るだけです。count()ステートメントにwhere条件が含まれている場合、 MyISAMもテーブル全体をスキャンする必要があることに注意してください
(11)自己成長フィールドの場合、InnoDBにはこのフィールドのみのインデックスが含まれている必要がありますが、他のフィールドで作成することもできますMyISAMテーブル内複合インデックス
(12)がテーブル全体を空にすると、InnoDBは行ごとに削除しますが、これは非常に低速です。MyISAMはテーブルを再構築します。

5.InnoDBの適用可能な本番シナリオ分析

(1)ビジネスにはトランザクションサポートが必要です
(2)行レベルのロックは高い同時実行性に適応する優れた機能を備えていますが、クエリがインデックスを通じて完了するようにする必要があります
(3)ビジネスデータが頻繁に更新されるシナリオ
など例:フォーラム、マイクロブログなど
(4)次のようなビジネスデータの整合性要件が高い
:銀行業務
(5)ハードウェア機器のメモリが大きい、InnoDBの優れたキャッシュ機能を使用して、メモリ使用率を改善し、ディスクIOの負荷を軽減する

6.企業がストレージエンジンを選択するための基礎

(1)各ストレージエンジンが提供するさまざまなコア機能とアプリケーションシナリオを検討する必要があります
(2)サポートされるフィールドとデータタイプ
a、すべてのエンジンが共通のデータタイプ
bをサポートしますが、すべてのエンジンが他のタイプのフィールド
バイナリオブジェクトなど)をサポートするわけではありません( 3)ロックの種類:さまざまなストレージエンジンがさまざまなレベルのロックを
サポート
a 、テーブルロック:MyISAMサポートb、行ロック:InnoDBサポート
(4)インデックスサポート
a、検索とリカバリでのインデックス作成データベース内のデータはパフォーマンスを大幅に向上させることができます
b。さまざまストレージエンジンはさまざまなインデックス作成手法を提供します
c。一部のストレージエンジンはインデックスをまったくサポートしていません
(5)トランザクション処理のサポート
a。更新を改善してテーブルの情報を挿入します期間中の信頼性
b。ストレージエンジンは次のように選択できますビジネスがトランザクションをサポートする必要があるかどうか

7.関連コマンド

#查看系统支持的存储引擎
show engines;

#查看表使用的存储引擎
方法一-:
show table status from 库名 where name='表名'\g

方法二:
use 库名;
show create table 表名;

#修改存储引擎
1.通过 alter table修改
use 库名;
alter table 表名 engine=MyISAM;

2.通过修改 /etc/my.cnf 配置文件,指定默认存储引擎并重启服务
vim /etc/my.cnf 
.......
[mysqld]
.......
default-storage-engine=INNODB

systemctl restart mysql.service
注意:此方法只对修改了配置文件并重启mysq1服务后新创建的表有效,已经存在的表不会有变更。

3.通过 create table 创建表时指定存储引擎
use 库名;
create table 表名 (字段1 数据类型,...) engine=MyISAM;

おすすめ

転載: blog.csdn.net/tefuiryy/article/details/113657864