理解MySQL數據庫事務

1. 什麼是事務處理?mysql

事務處理是一種機制,它是用來管理必須成批執行的mysql操做。來保證數據庫不完整的操做結果。sql

2. 爲何要使用事務處理?數據庫

在使用mysql操做數據的過程當中,若是隻是簡單的中小型程序而言,咱們不須要考慮mysql的事務。可是在比較複雜的狀況下,用戶執行某些數據操做過程當中,須要經過一組sql語句執行多項並行任務的時候。就必須保證操做數據的同步性。而且在執行中,產生依賴關係的動做可以同時操做成功或同時返回初始狀態。那麼在這種狀況下,就須要考慮使用mysql事務處理了。併發

在mysql中,事務是由單獨的一個或多個sql語句組成的。每一個sql語句都是互相依賴的。若是某條sql語句執行失敗或發生異常的狀況下,那麼整個操做都會回滾。全部的數據操做都會返回原始的初始狀態。若是單元中的全部的sql執行成功,那麼事務就被順利執行。網站

那麼打個比方,好比銀行轉帳爲列:spa

用戶A須要給用戶B轉帳1000元,那麼用戶A使用手機直接把1000元打到用戶B的銀行卡中了,指令已經發出去了,可是因爲用戶A把用戶B的銀行卡號輸入錯了,那麼這種狀況下,用戶B的銀行卡是不會多出1000元了,可是用戶A銀行卡少了1000元,那這樣的話確定是不合理的,所以咱們須要將用戶A向用戶B轉帳這麼一件事情當作一個事務來處理。若是用戶B的真實姓名和銀行卡號對不上的話,那麼整個轉帳事務就會失敗,那麼所以須要使用回滾操做,回滾到轉帳前的初始狀態。所以用戶A也不會少1000元,用戶B也不會增長1000元。那麼這種狀況下才是最合理的。命令行

事務處理中的一些術語的解釋:code

事務(transaction) 指一組sql語句。
回退(rollback) 指撤銷指定sql語句的過程。
提交(commit) 指將未存儲的sql語句結果寫入到數據庫中。
保留點(savepoint) 指事務處理中設置的臨時佔位符,咱們能夠對他們發佈回退操做。對象

3. mysql存儲引擎blog

mysql的存儲引擎是能夠改變的,默認是 InnoDB 存儲引擎,mysql中有8種存儲引擎。

1. MyISAM: 他是高速引擎,可是不支持事務處理。
2. InnoDB: 支持行鎖定以及事務處理,速度比MyISAM稍慢
3. ISAM: MyISAM的前身
4. MERGE: 將多個MyISAM類型的表做爲一個表來處理的引擎
5. MEMORY,HEAP: 只在內存上保存數據
6. Falcon: 一種新的存儲引擎,支持事務處理
7. ARCHIVE: 將數據壓縮後保存(只能支持INSERT/SELECT操做
8. CSV: 以CSV形式保存數據(應用於跨平臺數據交換)

如上只是瞭解下有哪些存儲引擎,其實咱們mysql的常見使用的存儲引擎就是 InnoDB,其餘的咱們能夠簡單的瞭解下就
能夠了。

數據庫事務相關命令以下:

1. 查看存儲引擎:SHOW CREATE TABLE 表名;
2. 更改引擎: ALTER TABLE 表名 ENGINE=新引擎名;
3. 回滾: ROLLBACK;
4. 聲明事務開始: BEIGIN;
5. 事務提交: COMMIT;
6. 查詢自動提交功能狀態: SELECT @@AUTOCOMMIT;
7. 設置自動提交功能: SET AUTOCOMMIT=0或1;
8. 設置分離水平: SET SESSION TRANSACTION ISOLATION LEVEL 分離水平;

1. 查看存儲引擎,使用命令:SHOW CREATE TABLE 表名; 以下圖所示:

2. 更改存儲引擎,使用命令:ALTER TABLE 表名 ENGINE=新引擎名; 以下圖所示:

4. 事務處理

事務有以下四大特性:

1. 原子性:指事務包含的全部操做要麼所有成功,要麼所有失敗回滾。

2. 一致性:指事務必須使數據庫從一個一致性狀態變換到另外一個一致性狀態。(好比拿轉帳來說,假設用戶A和用戶B二者的錢加起來一共是2000,那麼不論是用戶A仍是用戶B之間如何轉帳,轉幾回帳,事務結束後兩個用戶的錢加起來應該仍是2000,因此這就是事務的一致性)。

3. 隔離性:指當多個用戶併發訪問數據庫而且操做同一張表的時候,數據庫爲每個用戶開啓的事務,不能被其餘事務的操做所幹擾,多個併發事務之間要相互隔離。

4. 持久性:指一個事務一旦被提交了,那麼對數據庫中的數據的改變就是永久性的,哪怕是在數據庫系統遇到故障的狀況下也不會丟失提交事務的操做。

如上就是事務四大特性。咱們能夠簡單的理解下就能夠了。

4.1 回滾演示(ROLLBACK)

以下圖所示:

 

如上演示咱們能夠看到,當咱們刪除表格裏面的數據的時候,咱們再執行回滾操做(ROLLBACK), 刪除的記錄又恢復到begin以前的狀態,若是咱們將 ROLLBACK 換成 COMMIT 的話,那麼事務將會被提交了,刪除的事務就不能再恢復了。
以下繼續演示下:

4.2 自動提交

當咱們的mysql的數據庫的引擎爲 InnoDB的時候,咱們能夠設置自動提交功能是否開啓,當自動提交功能爲on的時候,命令執行就會提交(commit). 當咱們自動提交設置爲off的時候,必須執行commit纔會提交事務。可是咱們可使用rollback進行回滾操做。

首先咱們來查詢下當前自動提交功能的狀態;以下基本語法:

select @@autocommit;

以下所示:

咱們須要設置自動提交功能的基本語法以下:

set autocommit = 0 或 1;

注意:0 表明是off,1表明的是on.

4.2.1 自動提交設置爲off

若是咱們將自動提交設置爲off的時候,咱們插入一條記錄,而後咱們使用回滾 rollback的操做,咱們再次查看記錄,會發現咱們返回到了初始狀態。以下圖所示:

可是當咱們將自動提交設置爲on的時候,咱們插入一條數據後,而後咱們使用回滾 rollback的時候,咱們再次查看記錄,會發如今咱們插入數據的時候,會自動觸發commit狀態(自動提交). 所以回滾的時候是回滾不了初始咋提的。
以下圖所示:

4.3 部分回滾 savepoint

若是咱們設置 autocommit = 0 的時候,不自動提交,而後咱們使用 rollback會回滾到咱們的初始狀態的時候,而咱們如今經過 savepoint 就能夠保存一個點,經過 rollback to savepoint 就能夠回滾到保存的點了。

部分回滾主要有兩個步驟:

1. 保存點:執行命令:savepoint 保存點名;

2. 回滾到保存點:執行命令:rollback to savepoint 保存點名;

好比以下所示:

4.4 鎖定與事務處理

如上咱們使用rollback操做是指一個用戶下進行的。可是若是是多個用戶下同時操做呢?好比說12306購票系統,無數的人同時使用,所以咱們的事務必須可以處理多個用戶同時操做的狀況。所以咱們須要鎖定。

好比說:咱們過年的時候會在12306網站上同一刻時間點買票,好比說用戶A和用戶B同時登錄購票網站,而且買的是同一張票,好比說看到的都是剩餘1張票了,所以用戶A和用戶B趕忙下單,那麼這個下單的時間點確定是有前後順序對吧,那麼假如用戶A下單的時間更早,所以該票會被鎖定,所以用戶B就不能買了。這種狀況就是事務的鎖定。

4.4.1 鎖定分爲 共享鎖定 和 排他鎖定。

什麼是共享鎖定呢?共享鎖定是將對象數據變爲只讀形式,不能進行修改的。
什麼是排他鎖定呢?排他鎖定就是當咱們執行 insert/update/delete的時候,其餘的事務不能讀取該數據。所以咱們也能夠叫作寫入鎖定。

4.4.2 事務處理的分離水平

事務處理的分離水平通常是 READ UNCOMMITED; 它能夠是非提交讀取,也能夠不可重複讀取,還能夠是幻像讀取。

設置分離水平可使用以下命令:

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

1. 理解非提交讀取

什麼是非提交讀取呢?指的是別的事務可以讀取到尚未提交的更新數據。什麼意思呢?好比說我使用sql語句更新了一些數據,可是並無使用commit提交,可是其餘的用戶能夠查詢到我剛剛更新的數據。爲了演示下,咱們能夠打開2個命令行窗口,演示以下:

2. 理解不可重複讀取

不可重複讀取是指在某事務處理過程當中對數據進行讀取,因爲該事務更新操做致使屢次讀取數據時發生了改變。這個demo先省略了。。。

3. 理解幻象讀取

幻象讀取指的是,在某事物處理數據過程當中對數據屢次讀取,因爲該事務的插入/刪除操做而致使在屢次讀取過程當中讀取到不存在或者消失的數據。這個demo先省略了。。。

相關文章
相關標籤/搜索