ホームページ  >  記事  >  データベース  >  MySQL トランザクションおよびストレージ エンジン インスタンスの分析

MySQL トランザクションおよびストレージ エンジン インスタンスの分析

WBOY
WBOY転載
2023-05-27 20:29:43738ブラウズ

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 つの同一のクエリが連続して実行され、異なる結果が得られる場合、この状況は非反復読み取りと呼ばれます。これは、クエリ時にシステム内の他のトランザクションによる変更のコミットによって発生します。

再掲: ファントム読み取りとは、トランザクションがテーブル内の特定のデータ行を変更するが、別のトランザクションが同時に複数の新しいデータ行を挿入し、最初のトランザクションがクエリ時にさらにいくつかの行を検索することを指します。データ。同時に、別のトランザクションがテーブルを変更し、新しいデータ行を挿入しました。前のトランザクションを操作したユーザーは、テーブル内に未変更のデータ行がまだ残っていることに気づき、幻覚を見ているかのように驚くでしょう。

(4). 更新の喪失: 2 つのトランザクションが同時に同じレコードを読み取りました。A が最初にレコードを変更し、B もレコードを変更します (B は A がレコードを変更したことを知りません)。B の後がデータを提出すると、Bの修正結果は上書きされ、Aの修正結果が上書きされます。

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

(1)、コミットされていない読み取り: コミットされていないデータを読み取り、ダーティ リードを解決しません

(2)、コミットされた読み取り: 送信された読み取りデータはダーティ リードを解決できます

(3)、反復可能な読み取り: 再読み取りはダーティ リードと反復不可能な読み取りを解決できます------------- Mysql のデフォルトは

です(4)、直列化可能: 直列化。ダーティ読み取り、非反復読み取り、および仮想読み取りを解決できます。---------------- ロック テーブルと同等です。 注: デフォルトのトランザクション処理レベルは、 mysql は反復読み取りですが、Oracle と SQL Server は読み取りがコミットされます

1. クエリ グローバル トランザクション分離レベル

show global variables like '%isolation%';
或
select @@global.tx_isolation;

MySQL トランザクションおよびストレージ エンジン インスタンスの分析

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

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

MySQL トランザクションおよびストレージ エンジン インスタンスの分析

#3. グローバル トランザクション分離レベルの設定

set global transaction isolation level read committed;
show global variables like '%isolation%';

MySQL トランザクションおよびストレージ エンジン インスタンスの分析#4. セッション トランザクション分離レベルの設定

set session transaction isolation level read committed;
show session variables like '%isolation%';

#

三、事务控制语句

1、相关语句

begin;               开启事务
commit;              提交事务,使已对数据库进行的所有修改变为永久性的
rollback;            回滚事务,撤销正在进行的所有未提交的修改
savepoint s1;        建立回滚点,s1为回滚点名称,一个事务中可以有多个
rollback to s1;      回滚到s1回滚点

2、案例

①、创建表

create database school;
use school;
create table Fmoney(
id int(10) primary key not null,  
name varchar(20),  
money decimal(5,2));

insert into Fmoney values ('1','srs1','100');
insert into Fmoney values ('2','srs2','200');
select * from Fmoney;

MySQL トランザクションおよびストレージ エンジン インスタンスの分析

②、测试提交事务

begin;
update Fmoney set money= money - 100 where name='srs2';
commit;
quit

mysql -u root -p
use school;
select * from Fmoney;

MySQL トランザクションおよびストレージ エンジン インスタンスの分析

③、测试回滚事务

begin;
update Fmoney set money= money + 100 where name='srs2';
select * from Fmoney;
rollback;

select * from Fmoney;

MySQL トランザクションおよびストレージ エンジン インスタンスの分析

④、测试多点回滚

begin;
update Fmoney set money= money + 100 where name='srs2';
select * from Fmoney;
savepoint a;
update Fmoney set money= money + 100 where name='srs1';
select * from Fmoney;
savepoint b;
insert into Fmoney values ('3','srs3','300');
select * from Fmoney;

rollback to b;
select * from Fmoney;

MySQL トランザクションおよびストレージ エンジン インスタンスの分析

MySQL トランザクションおよびストレージ エンジン インスタンスの分析

3、使用 set 设置控制事务

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

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

MySQL トランザクションおよびストレージ エンジン インスタンスの分析

四、MySQL 存储引擎

1、存储引擎概念介绍

(1)MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平,并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎。

(2)存储引擎是MySQL将数据存储在文件系统中的存储方式或者存储格式

(3)MySQL 常用的存储引擎有: a、MylSAM b、InnoDB

(4)MySQL数据库中的组件,负责执行实际的数据I/O操作

(5)MySQL系统中,存储引擎处于文件系统之.上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行存储。

2、查看系统支持的存储引擎

show engines;

MySQL トランザクションおよびストレージ エンジン インスタンスの分析

3、查看表使用的存储引擎

(1)方法一:直接查看
show table status from 库名 where name='表名'\G;
例:
show table status from school where name='class'\G;

(2)方法二:进入数据库查看
use 库名;
show create table 表名\G;

例:
use school;
show create table class\G;

MySQL トランザクションおよびストレージ エンジン インスタンスの分析

4、修改存储引擎

(1) 方法一:通过 alter table 修改
use 库名;
alter table 表名 engine=MyISAM;

例:
use school;
alter table class engine=MYISAM;

(2)方法二:通过修改 /etc/my.cnf 配置文件,指定默认存储引擎并重启服务
注意:此方法只对修改了配置文件并重启mysql服务后新创建的表有效,已经存在的表不会有变更。
vim /etc/my.cnf
......
[mysqld]
......
default-storage-engine=INNODB

systemctl restart mysql.service


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

例:
mysql -u root -p
use school;
create table test7(id int(10) not null,name varchar(20) not null) engine=MyISAM;

MySQL トランザクションおよびストレージ エンジン インスタンスの分析

MySQL トランザクションおよびストレージ エンジン インスタンスの分析

MySQL トランザクションおよびストレージ エンジン インスタンスの分析

以上がMySQL トランザクションおよびストレージ エンジン インスタンスの分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。