1. 程式人生 > 其它 >Mysql-事務與儲存引擎

Mysql-事務與儲存引擎

Mysql-事務與儲存引擎

一、MySQL 事物

二、MySQL 儲存引擎

三、MyISAM適用的生產場景舉例

四、InnoDB特點

五、InnoDB適用生產場景分析

六、企業選擇儲存引擎依據

一、MySQL 事物

1.事務的概念

●事務是一種機制、一個操作序列,包含了一組資料庫操作命令,並且把所有的命令作為一個整體一起向系統提交或撤銷操作請求,即這一組資料庫命令要麼都執行,要麼都不執行。
●事務是一個不可分割的工作邏輯單元,在資料庫系統上執行併發操作時,事務是最小的控制單元。


●事務適用於多使用者同時操作的資料庫系統的場景,如銀行、保險公司及證券交易系統等等。
●事務通過事務的整體性以保證資料的一致性。

說白了,所謂事務,它是一個操作序列,這些操作要麼都執行,要麼都不執行,它是一個不可分割的工作單位。

2.事務的ACID特點

ACID,是指在可靠資料庫管理系統(DBMS)中,事務(transaction)應該具有的四個特性:
原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、永續性(Durability)
這是可靠資料庫所應具備的幾個特性。

1)原子性

●原子性:指事務是一個不可再分割的工作單位,事務中的操作要麼都發生,要麼都不發生。


事務是一個完整的操作,事務的各元素是不可分的。
事務中的所有元素必須作為一個整體提交或回滾。
如果事務中的任何元素失敗,則整個事務將失敗。

案例:
A給B轉帳100元錢的時候只執行了扣款語句,就提交了,此時如果突然斷電,A賬號已經發生了扣款,B賬號卻沒收到加款,在生活中就會引起糾紛。這種情況就需要事務的原子性來保證事務要麼都執行,要麼就都不執行。

2)一致性

●一致性:指在事務開始之前和事務結束以後,資料庫的完整性約束沒有被破壞。
當事務完成時,資料必須處於一致狀態。
在事務開始前,資料庫中儲存的資料處於一致狀態。
在正在進行的事務中,資料可能處於不一致的狀態。
當事務成功完成時,資料必須再次回到已知的一致狀態。

案例:
對銀行轉帳事務,不管事務成功還是失敗,應該保證事務結束後表中A和B的存款總額跟事務執行前一致。

3)隔離性

●隔離性:指在併發環境中,當不同的事務同時操縱相同的資料時,每個事務都有各自的完整資料空間。
對資料進行修改的所有併發事務是彼此隔離的,表明事務必須是獨立的,它不應以任何方式依賴於或影響其他事務。
修改資料的事務可在另一個使用相同資料的事務開始之前訪問這些資料,或者在另一個使用相同資料的事務結束之後訪問這些資料。

事務之間的相互影響分為幾種,分別為

(1)髒讀:一個事務讀取了另一個事務未提交的資料,而這個資料是有可能回滾的。
(2)不可重複讀:一個事務內兩個相同的查詢卻返回了不同資料。這是由於查詢時系統中其他事務修改的提交而引起的。
(3)幻讀:一個事務對一個表中的資料進行了修改,這種修改涉及到表中的全部資料行。同時,另一個事務也修改這個表中的資料,這種修改是向表中插入一行新資料。那麼,操作前一個事務的使用者會發現表中還有沒有修改的資料行,就好象發生了幻覺一樣。
(4)丟失更新:兩個事務同時讀取同一條記錄,A先修改記錄,B也修改記錄(B不知道A修改過),B提交資料後B的修改結果覆蓋了A的修改結果。

Mysql及事物隔離級別

(1)read uncommitted : 讀取尚未提交的資料 :不解決髒讀
(2)read committed讀取已經提交的資料 :可以解決髒讀
(3)repeatable read重讀讀取:可以解決髒讀 和 不可重複讀 ---mysql預設的
(4)serializable序列化:可以解決 髒讀 不可重複讀 和 虛讀---相當於鎖表

mysql預設的事務處理級別是 repeatable read ,而Oracle和SQL Server是 read committed

查詢全域性事務隔離級別

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;

4)永續性

●永續性:在事務完成以後,該事務所對資料庫所作的更改便持久的儲存在資料庫之中,並不會被回滾。
指不管系統是否發生故障,事務處理的結果都是永久的。
一旦事務被提交,事務的效果會被永久地保留在資料庫中。

總結:在事務管理中,原子性是基礎,隔離性是手段,一致性是目的,永續性是結果。

3.事務控制語句

BEGINSTART TRANSACTION:顯式地開啟一個事務。
COMMITCOMMIT WORK:提交事務,並使已對資料庫進行的所有修改變為永久性的。
ROLLBACKROLLBACK WORK:回滾會結束使用者的事務,並撤銷正在進行的所有未提交的修改。
SAVEPOINT S1:使用 SAVEPOINT 允許在事務中建立一個回滾點,一個事務中可以有多個 SAVEPOINT;“S1”代表回滾點名稱。
ROLLBACK TO [SAVEPOINT] S1:把事務回滾到標記點

案例:
use kgc;
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 - 100 where name='A';
commit;
quit

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

#測試回滾事務
begin;
update account set money= money + 100 where name='A';
rollback;

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

#測試多點回滾
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',1000);

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

例:

測試提交事務

測試回滾事務

測試多點回滾

4.使用 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; 都是獨立的事務。 use kgc; select * from account; SET AUTOCOMMIT=0; update account set money= money + 100 where name='B'; select * from account; quit mysql -u root -p use kgc; select * from account;

二、MySQL 儲存引擎

1.儲存引擎概念

• MySQL中的資料用各種不同的技術儲存在檔案中,每一種技術都使用不同的儲存機制、索引技巧、鎖定水平並最終提供不同的功能和能力,這些不同的技術以及配套的功能在MySQL中稱為儲存引擎

• 儲存引擎是MySQL將資料儲存在檔案系統中的儲存方
式或者儲存格式

• MySQL常用的儲存引擎
▷MyISAM
▷InnoDB

• MySQL資料庫中的元件,負責執行實際的資料/O操作

• MySQL系統中,儲存引擎處於檔案系統之上,在資料儲存到資料檔案之前會傳輸到儲存引擎,之後按照各個儲存引擎的儲存格式進行儲存

2.MyISAM的特點介紹

• MyISAM不支援事務,也不支援外來鍵約束,只支援全文索引,資料檔案和索引檔案是分開儲存的
• 訪問速度快,對事務完整性沒有要求
• MyISAM適合查詢、插入為主的應用
• MyISAM在磁碟上儲存成三個檔案,檔名和表名都相同,但是副檔名分別為:

▷.frm檔案儲存表結構的定義
▷資料檔案的副檔名為.MYD (MYData)
▷索引檔案的副檔名是.MYI (MYIndex)

• 表級鎖定形式,資料在更新時鎖定整個表
• 資料庫在讀寫過程中相互阻塞
▷會在資料寫入的過程阻塞使用者資料的讀取
▷也會在資料讀取的過程中阻塞使用者的資料寫入
• 資料單獨寫入或讀取,速度過程較快且佔用資源相對少
• MyIAM支援的儲存格式
▷靜態表
▷動態表
▷壓縮表

三、MyISAM適用的生產場景舉例

• 公司業務不需要事務的支援
• 單方面讀取或寫入資料比較多的業務
• MyISAM儲存引擎資料讀寫都比較頻繁場景不適合
• 使用讀寫併發訪問相對較低的業務
• 資料修改相對較少的業務
• 對資料業務-致性要求不是非常高的業務
• 伺服器硬體資源相對比較差

四、InnoDB特點

• 支援事務,支援4個事務隔離級別
• MySQL從5.5.5版本開始,預設的儲存引擎為InnoDB
• 讀寫阻塞與事務隔離級別相關
• 能非常高效的快取索引和資料
• 表與主鍵以簇的方式儲存
• 支援分割槽、表空間,類似oracle資料庫
• 支援外來鍵約束,5.5前不支援全文索引,5.5後支援全文索引
• 對硬體資源要求還是比較高的場合
• 行級鎖定,但是全表掃描仍然會是表級鎖定,如

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

• InnoDB中不儲存表的行數,如select count(* ) from table;時,InnoDB需要掃描一遍整個表來計算有多少行,但是MyISAM只要簡單的讀出儲存好的行數即可。需要注意的是,當count(*)語句包含where條件時MyISAM也需要掃描整個表。

• 對於自增長的欄位,InnoDB 中必須包含只有該欄位的索引,但是在MyISAM表中可以和其他欄位一起建立組合索引。

•清空整個表時,InnoDB是- -行一 行的刪除,效率非常慢。MyISAM則會重建表。

五、InnoDB適用生產場景分析

• 業務需要事務的支援
• 行級鎖定對高併發有很好的適應能力,但需確保查詢是通過索引來完成
• 業務資料更新較為頻繁的場景
▷ 如:論壇,微博等
• 業務資料一致性要求較高
▷如:銀行業務
• 硬體裝置記憶體較大,利用InnoDB較好的快取能力來提高記憶體利用率,減少磁碟I0的壓力

六、企業選擇儲存引擎依據

• 需要考慮每個儲存引擎提供了哪些不同的核心功能及應用場景

• 支援的欄位和資料型別
▷所有引擎都支援通用的資料型別
▷但不是所有的引擎都支援其它的欄位型別,如二進位制物件

• 鎖定型別:不同的儲存引擎支援不同級別的鎖定
▷表鎖定: MyISAM 支援
▷行鎖定: InnoDB 支援

索引的支援
•建立索引在搜尋和恢復資料庫中的資料時能顯著提高效能
•不同的儲存弓|擎提供不同的製作索引的技術
•有些儲存弓|擎根本不支援索引

事務處理的支援
•提高在向表中更新和插入資訊期間的可靠性
•可根據企業業務是否要支援事務選擇儲存引擎
MyISAM 表支援 3 種不同的儲存格式

(1)靜態(固定長度)表
靜態表是預設的儲存格式。靜態表中的欄位都是非可變欄位,這樣每個記錄都是固定長度的,這種儲存方式的優點是儲存非常迅速,容易快取,出現故障容易恢復;缺點是佔用的空間通常比動態表多。

(2)動態表
動態表包含可變欄位,記錄不是固定長度的,這樣儲存的優點是佔用空間較少,但是頻繁的更新、刪除記錄會產生碎片,需要定期執行 OPTIMIZE TABLE 語句或 myisamchk -r 命令來改善效能,並且出現故障的時候恢復相對比較困難。

(3)壓縮表
壓縮表由 myisamchk 工具建立,佔據非常小的空間,因為每條記錄都是被單獨壓縮的,所以只有非常小的訪問開支。

檢視系統支援的儲存引擎

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
注意:此方法只對修改了配置檔案並重啟mysql服務後新建立的表有效,已經存在的表不會有變更。

3.通過 create table 建立表時指定儲存引擎
use 庫名;
create table 表名(欄位1 資料型別,...) engine=MyISAM;

例:

通過 alter table 修改