日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql支持事务的存储引擎_MySQL基础(三)【MySQL事务与存储引擎】

發布時間:2025/3/15 数据库 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql支持事务的存储引擎_MySQL基础(三)【MySQL事务与存储引擎】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

3.1-數據庫事務

什么是事務

一系列有序的數據庫操作:

要么全部成功

要么全部回退到操作前的狀態

中間狀態對其他連接不可見

事務的基本操作:

基本操作 說明

start transaction 開始事務

commit 提交(全部完成)

rollback 回滾(回到初始狀態)

-- 開啟一個事務

start transaction;

-- 或者使用(非標準sql)

begin;

insert into t values (1, 1, 1);

-- 事務結束,插入成功

commit;

begin;

insert into t values (2, 1, 1);

insert into t values (3, 1, 1);

insert into t values (4, 1, 1);

-- 事務結束,沒有插入數據

rollback;

begin;

insert into t values (1, 1, 1);

savepoint a1;

insert into t values (2, 1, 1);

-- 回滾到指定的保存點

rollback to a1;

commit;

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

自動提交

autocommit可以在session級別設置

每個DML操作都自動提交

DDL永遠都是自動提交,無法通過rollback回滾

事務的四個基本屬性(ACID)

原子性(Atomicity)

一致性(Consistency)

隔離性(Isolation)

持久性(Durability)

事務的原子性

包含在事務中的操作要么全部被執行,要么都不執行

中途數據庫或應用發生異常,未提交的事務都應該被回滾

事務的一致性

數據的正確性,合理性,完整性

數據一致性應該符合應用需要規則:

余額不能是負數

交易對象必須先有賬號

用戶賬號不能重復

事務的結果需要滿足數據的一致性約束

事物的持久性

提交完成的事務對數據庫的影響必須是永久性的

數據庫異常不會丟失事務更新

通常認為成功寫入磁盤的數據即為持久化成功

事務的持久化的實現

數據文件持久化

隨機同步刷新(慢)

事務日志持久化與實例恢復

順序同步刷新(快) -> 事務日志

隨機異步刷新 -> 磁盤

事務日志 -> 磁盤(實例恢復)

事務的隔離性

數據庫事務在提交完成前,中間的任何數據變化對其他的事務都是不可見的。

數據庫隔離現象

隔離現象 描述

臟讀(Dirty Read) 事務B讀到事務A尚未提交的數據變更

不可重復讀(NonRepeatable Read) 事務B讀取前后兩次讀取一條記錄之間該記錄被事務A修改并提交,于是事務B讀到了不一樣的結果

幻讀(Phantom Read) 事務B按條件匹配到了若干行記錄并修改。但是由于修改過程中事務A新插入了符合條件記錄,導致B更新完成后發現仍有符合條件卻未被更新的記錄。

數據庫隔離等級

隔離等級 臟讀 不可重復讀 幻讀

未提交讀 可能 可能 可能

已提交讀 不可能 可能 可能

可重復讀 不可能 不可能 可能

可串行化讀 不可能 不可能 不可能

MySQL的事務隔離級別

InnoDB默認標記為可重復讀

InnoDB并不是標準定義上的課重復讀

InnoDB默認在可重復讀的基礎上避免幻讀

MySQL事務隔離級別設置

可在global/session/下個事務,級別分別進行設置

建議使用Read committed(同Oracle)

或者建議使用默認的Repeatable read

set tx_isolation = ''

-- 設置隔離級別

1

2

事務與并發寫

某個正在更新的記錄再提交或回滾前不能被其他事務同時更新

事務回滾的實現

回滾段(rollback segment)與數據前像

3.2-存儲引擎概述

MySQL程序層次架構

MySQL架構

MySQL存儲引擎

有多種可選方案,可插拔,可修改存儲引擎

基于表選擇使用何種存儲引擎

主要存儲引擎

存儲引擎 常用度 支持事務

InnoDB 主要,推薦 是

MyISAM 古老,偶爾有用,系統表 否

MEMORY 偶爾臨時表有用,純內存 否

BLACKHOLE 不用來存放數據,個別特殊用處 否

TokuDB 新穎,個別特殊場景有奇效 是

Cluster 新穎,分布式,內存,線上不要用 是

InnoDB存儲引擎

索引組織表

支持事務

支持行級鎖

數據塊緩存

日志持久化

穩定可靠,性能好,線上盡量使用InnoDB

MyISAM存儲引擎

堆表

不支持事務

只維護索引緩存池,表數據緩存交給操作系統

鎖粒度較大

數據文件可以直接拷貝,偶爾可能會用上

不建議線上業務數據使用

MWMORY存儲引擎

數據全內存存放,無法持久化

性能較高

不支持事務

適合偶爾作為臨時表使用

create temporary table tmp (id int) engine = memory ;

BLACKHOLE存儲引擎

數據不作任何存儲

利用MySQL Replicate,充當日志服務器

在MySQL Replicate環境中充當代理主

TokuDB

分形樹存儲結構

支持事務

行鎖

壓縮效率較高

適合大批量insert的場景

MySQL Cluster

多主分布式集群

數據節點間冗余,高可用

支持事務

設計上易于擴展

面向未來,線上慎用

改變表的存儲引擎

alter table m ENGINE=innodb;

3.3-InnoDB存儲引擎

InnoDB存儲引擎體系架構

InnoDB

InnoDB相關的磁盤文件

文件 名稱 數量 位置

系統表空間 ibdata1 一個實例一個 innodb_data_home_dir

日志文件 ib_logfile0/1 一個實例兩個(可配置) innodb_log_group_home_dir

表定義文件 表名.frm 每張表一個 Schema目錄下

表數據文件 表名.ibd 如果innodb_file_per_table = 1, 則每張表一個 Schema目錄下

InnoDB系統表空間文件

ibdata1里存放了什么:

回滾段

所有InnoDB表元數據信息

Double Write, Insert buffer dump等等….

自動擴展機制

InnoDB與磁盤文件有關的參數

參數 樣例值 備注

innodb_data_home_dir /data/mysql/node_1 數據主目錄

innodb_log_group_home_dir /data/mysql/node_1 一般同上

innodb_data_file_path ibdata1:512M:autoextned 請開啟autoextned

innodb_autoextend_increment 128 MB,勿太大或太小

innodb_file_per_table 1 強烈建議開啟

innodb_log_file_size 100MB 性能相關

innodb_log_files_in_group 2 性能相關

InnoDB數據文件存儲結構

索引組織表(聚簇表)

根據表邏輯主鍵排序

數據節點每頁16K

根據主鍵尋址速度很快

主鍵值遞增的insert插入效率較好

主鍵值隨機insert插入效率差

因此,InnoDB表必須指定主鍵,建議使用自增數字

InnoDB數據塊緩存池

數據的讀寫需要經過緩存

數據以整頁(16K)為單位讀取到緩存中

緩存中的數據以LRU策略換出

IO效率高,性能好

InnoDB Buffer Pool相關參數

參數 樣例值 備注

innodb_buffer_pool_size 10G 根據總物理內存設置

InnoDB數據持久化與事務日志

事務日志實時持久化

內存變化數據(臟數據)增量異步刷出到磁盤

實例故障靠重放日志恢復

性能好,可靠,恢復快

InnoDB日志持久化相關參數

參數 樣例值 備注

innodb_flush_log_at_trx_commit 1 可選:0:每隔1s寫入并持久化一次日志。1:每次commit都寫入并持久化日志。2:每次提交日志寫到內存,每1s持久化一次

InnoDB行級鎖

寫不阻塞讀

不同行間的寫互相不阻塞

并發性能好

InnoDB與事務ACID

事務ACID特性完整支持

回滾段失敗回滾

支持主外鍵約束

事務版本+回滾段=MVCC

事務日志持久化

默認可重復讀隔離級別,可以調整

3.4-InnoDB事務鎖

什么是計算機程序鎖

計算機程序鎖

控制對共享資源進行并發訪問

保護數據的完整性和一致性

數據庫中的鎖

分為兩個大類

lock latch/mutex

對象 事務

保護 數據庫邏輯內容

持續時間 事務過程中

我們主要關心的是事務鎖

數據庫事務并發

對同一行記錄的修改必須串行化

事務鎖粒度

行鎖

InnoDB, Oracle

頁鎖

SQL Server

表鎖

MyISAM, Memory

鎖升級

InnoDB存儲引擎中的鎖模式與粒度

四種基本鎖模式

共享鎖(S) - 讀鎖 - 行鎖

排他鎖(X) - 寫鎖 - 行鎖

意向共享鎖(IS) - 表級

意向排他鎖(IX) - 表級

意向鎖

意向鎖總是自動先加,并且意向鎖自動加自動釋放

意向鎖提示數據庫這個session將要在接下來施加何種鎖

意向鎖和X/S鎖級別不同,除了阻塞全表級別的X/S鎖外其他任何鎖

InnoDB鎖模式互斥

鎖互斥

數據庫加鎖操作

一般的select語句不加任何鎖,也不會被任何事物鎖阻塞

讀的隔離性由MVCC確保

S鎖

手動:select from tb_test lock in share mode;

自動:insert前

X鎖

手動:select from tb_test lock for update;

自動:update,delete前

InnoDB行鎖的實現

通過索引項加鎖實現

只有條件走索引才能實現行級鎖

索引上有重復值,可能鎖住多個記錄

查詢有多個索引可以走,可以對不同索引加鎖

是否對索引加鎖實際上取決于MySQL執行計劃

自增主鍵做條件更新,性能最好

沒有索引的話會對整張表加鎖。

InnoDB的gap lock

什么是幻讀

gap lock消滅幻讀

InnoDB消滅幻讀僅僅為了確保statement模式replicate的主從一致性

小心gap lock

自增主鍵做條件更新,性能最好

死鎖

什么是死鎖

A、B兩個事務,A先更新t1,同時B更新t2,A再更新t2,B再更新t1就發生了死鎖。

死鎖數據庫自動解決

數據庫挑選沖突事務中回滾代價較小的事務回滾

死鎖預防

單表死鎖可以根據批量更新里的更新條件排序

可能沖突的跨表事務盡量避免并發

盡量縮短事務長度

業務邏輯加鎖

業務流程中的悲觀鎖

任何的并發修改都有可能造成我們的業務邏輯最終的錯誤,在事務流程中一開始就加鎖,最后釋放

如何縮短鎖的時間

總結

以上是生活随笔為你收集整理的mysql支持事务的存储引擎_MySQL基础(三)【MySQL事务与存储引擎】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。