自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

MySQL事務,這篇文章就夠了

數據庫 MySQL
下面我們趁熱打鐵,介紹一下事務的必知必會的四大特性,這幾個特性也是在面試中,面試官面試MySQL的相關知識的時候,問的比較多的問題。

0 什么是事務

事務(Transaction) 是并發(fā)控制的基本單位。所謂的事務,它是一個操作序列,這些操作要么都 執(zhí)行,要么都不執(zhí)行,它是一個不可分割的工作單位。事務是數據庫維護數據一致性的單位,在每 個事務結束時,都能保持數據一致性。

同時,事務有著嚴格的地定義,必須滿足四個特性,也就是我們一直說的ACID,但是,并不是說各種數據庫就一定會滿足四個特性,對于不同的數據庫的實現(xiàn)來說,在不同程度上是不一定完全滿足要求的,比如,Oracle數據庫來說,默認的事務隔離級別是READ COMMITTED,是不滿足隔離性的要求的。

下面我們趁熱打鐵,介紹一下事務的必知必會的四大特性,這幾個特性也是在面試中,面試官面試MySQL的相關知識的時候,問的比較多的問題,所以,這幾個特性務必需要理解并且透徹的記在心里,開個玩笑,被火車撞了,也不應該忘記這四個特性!

1 事務的四大特性

事務的四大特性簡稱為:ACID,分別是原子性、一致性、隔離性和持久性。

下面我們一一來介紹一下。

  •  原子性(Atomicity)

原子性指的是整個數據庫的事務是一個不可分割的工作單位,每一個都應該是一個原子操作。

當我們執(zhí)行一個事務的時候,如果一系列的操作中,有一個操作失敗了,那么,需要將這一個事務中的所有操作恢復到執(zhí)行事務之前的狀態(tài),這就是事務的原子性。

下面舉個簡單的例子。 

  1. i++; 

上面這個最簡單不過的代碼經常也會被問到,這是一個原子操作嗎?那肯定不是,如果我們把這個代碼放到一個事務中來說,當i+1出現(xiàn)問題的時候,回滾的就是整個代碼i++(i = i + 1)了,所以回滾之后,i的值也是不會改變的。

以上就是原子性的概念。

  •  一致性(consistency)

一致性是指事務將數據庫從一種狀態(tài)轉變?yōu)橄乱环N一致性的狀態(tài),也就是說在事務執(zhí)行前后,這兩種狀態(tài)應該是一樣的,也就是數據庫的完整性約束不會被破壞。

另外,需要注意的是一致性是不關注中間狀態(tài)的,比如銀行轉賬的過程,你轉賬給別人,至于中間的狀態(tài),你少了500 ,他多了500,這些中間狀態(tài)不關注,如果分多次轉賬中間狀態(tài)也是不可見的,只有最后的成功或者失敗的狀態(tài)是可見的。

如果到分布式的一致性問題,又可以分為強一致性、弱一致性和最終一致性,關于這些概念,可以自己查查,還是很有意思的。

  •  隔離性(isolation)

事務我們是可以開啟很多的,MySQL數據庫中可以同時啟動很多的事務,但是,事務和事務之間他們是相互分離的,也就是互不影響的,這就是事務的隔離性。

  •  持久性(durability)

事務的持久性是指事務一旦提交,就是永久的了,就是發(fā)生問題,數據庫也是可以恢復的。因此,持久性保證事務的高可靠性。

2 事務的分類

事務可以分為很多中類型,一般分為:扁平事務、帶有保存點的扁平事務、鏈事務、嵌套事務、分布式事務。

扁平事務

扁平事務是最簡單的一種,在實際開發(fā)中也是使用的最多的一種事務。在這種事務中,所有操作都處于同一層次,最常見的方式如下: 

  1. BEGIN WORK  
  2. Operation 1  
  3. Operation 2  
  4. Operation 3  
  5. ...  
  6. Operation N  
  7. COMMIT WORK 

舉個例子 

  1. begin work;  
  2. select * from user;  
  3. update user set name = 'sihai' where id = 1 
  4. commit work; 

扁平事務的主要缺點是不能提交或回滾事務的某一部分,或者分幾個獨立的步驟去提交。

帶有保存點的扁平事務

這種事務除了支持扁平事務支持的操作外,這種事務跟扁平事務最大的區(qū)別就是允許在事務執(zhí)行過程中回滾到同一事務中較早的一個狀態(tài),這是因為可能某些事務在執(zhí)行過程中出現(xiàn)的錯誤并不會對所有的操作都無效,放棄整個事務不合乎要求,開銷也太大。保存點用來通知系統(tǒng)應該記住事務當前的狀態(tài),以便以后發(fā)生錯誤時,事務能回到該狀態(tài)。

舉個例子 

  1. begin work;  
  2. select * from user;  
  3. savepoint t1;  
  4. update user set name = 'sihai' where id = 1 
  5. savepoint t2;  
  6. commit work; 

通過上面的方式我們就建立了兩個保存點t1、t2,通過ROLLBACK TO SAVEPOINT t1,我們就可以返回到保存點t1。

鏈事務

鏈事務:在提交一個事務時,釋放不需要的數據對象,將必要的處理上下文隱式的傳給下一個要開始的事務。需要注意,提交事務操作和下一個事務操作將合并為一個原子操作,就是下一個事務可以看到上一個事務的結果。

鏈事務,就是指回滾時,只能恢復到最近一個保存點;而帶有保存點的扁平事務則可以回滾到任意正確的保存點。

舉個例子 

  1. begin work;  
  2. select * from user;  
  3. savepoint t1;  
  4. update user set name = 'sihai' where id = 1 
  5. savepoint t2;  
  6. commit work; 

還是這個例子,但是對于鏈事務來說,是不能直接rollback到保存點t1的,最能恢復到最近的一個保存點t2;另外我們需要注意,鏈事務在執(zhí)行commit后就會釋放當前事務所持有的所有鎖,而帶有保存點的扁平事務不會影響所持有的鎖。

嵌套事務

在事務中再嵌套事務,這種結構有點像一顆橫著的樹的結構,位于根節(jié)點的事務稱為頂層事務。事務的前驅稱為父事務,其它事務稱為子事務。事務的前驅稱為父事務,事務的下一層稱為子事務。

子事務既可以提交也可以回滾,但是它的提交操作并不馬上生效,除非由其父事務提交。因此就可以確定,任何子事務都在頂層事務提交后才真正的被提交了。同理,任意一個事務的回滾都會引起它的所有子事務一同回滾。

 

  1. BEGIN WORK  
  2.      SubTransaction1:  
  3.              BEGIN WORK  
  4.                  SubOperationX  
  5.              COMMIT WORK  
  6.      SubTransaction2:  
  7.              BEGIN WORK  
  8.                  SubOperationY  
  9.              COMMIT WORK  
  10.      ...  
  11.      SubTransactionN:  
  12.              BEGIN WORK  
  13.                  SubOperationN  
  14.              COMMIT WORK  
  15. COMMIT WORK 

分布式事務

分布式事務通常是指在一個分布式環(huán)境下運行的扁平事務,因此需要根據數據所在位置訪問網絡中的不同節(jié)點。

在不同的物理地址,通過網絡訪問,執(zhí)行不同的事務,這就是分布式事務。

3 事務的使用

首先這一部分我們還是先介紹一下這些事務的語句,也不是很多,使用也不復雜,下面用一個表格做一個整理。

注意:COMMIT和COMMIT WORK語句不同之處在于COMMIT WORK用來控制事務結束后的行為是CHAIN還是RELEASE,如果是CHAIN,那么事務就是鏈事務。

用戶可以通過參數completion_type控制,如下:

  •  completion_type = 1 實例

執(zhí)行下面的操作; 

  1. SET @@completion_type = 1 
  2. BEGIN WORK;  
  3. INSERT INTO lock_test SELECT 10;  
  4. COMMIT WORK; 

接著我們再執(zhí)行下面的操作; 

  1. INSERT INTO lock_test SELECT 115;  
  2. ROLLBACK;  
  3.  SELECT * FROM lock_test; 

我們先插入一條數據115,然后再回滾,我們知道如果不是在一個事務的時候,115應該是會插入成功的,就算我們回滾了,但是,這里我們回滾之后,查詢結果如下:

這個時候并沒有115這條記錄,也就是回滾生效了,說明在COMMIT WORK之后,又是一個新的事務,所以才會出現(xiàn)這樣的結果。

  •  completion_type = 2 實例

我們先進行下面的操作; 

  1. SET @@completion_type = 2 
  2. BEGIN WORK;  
  3. INSERT INTO lock_test SELECT 5;  
  4. COMMIT WORK; 

上面我們已經提交事務了,當我們使用下面的語句查詢lock_test的數據的時候,就會出現(xiàn)斷開連接。 

  1. SELECT * FROM lock_test; 

4 事務的隔離級別

事務的隔離級別有四種分別是:

  •  READ UNCOMMITTED
  •  READ COMMITTED
  •  REPEATABLE READ
  •  SERIALIZABLE

對于這幾種隔離級別會帶來的問題及總結,可以查看這篇文章:MySQL的又一神器-鎖,MySQL面試必備

5 總結

這篇文章從下面幾個內容介紹了一下MySQL數據庫事務的內容,更詳細的其他內容在后面的文章中再講解。

  •  概念
  •  事務類型
  •  事務使用
  •  事務的隔離級別

文章有不當之處,歡迎指正,如果喜歡微信閱讀,你也可以關注我的微信公眾號:好好學java,獲取優(yōu)質學習資源。 

 

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2017-03-30 22:41:55

虛擬化操作系統(tǒng)軟件

2017-12-12 12:53:09

2017-03-10 21:04:04

Android適配

2017-03-07 15:35:26

Android適配 界面

2021-11-10 07:47:48

Traefik邊緣網關

2019-07-10 15:15:23

JVM虛擬機Java

2022-05-27 08:18:00

HashMapHash哈希表

2024-07-05 11:01:13

2019-09-25 09:17:43

物聯(lián)網技術信息安全

2024-03-26 00:00:06

RedisZSet排行榜

2020-07-08 10:36:18

Linux 運維 數據

2018-10-31 17:22:25

AI人工智能芯片

2021-06-04 07:27:24

sourcemap前端技術

2020-10-13 07:44:40

緩存雪崩 穿透

2024-02-28 08:59:47

2018-08-17 09:14:43

餓了么容器演進

2021-04-09 10:03:12

大數據exactly-onc

2022-08-26 05:22:21

RabbitMQ架構

2018-04-23 11:00:44

PythonRedisNoSQL

2023-09-04 08:00:00

開發(fā)Java線程
點贊
收藏

51CTO技術棧公眾號