資料庫事務
訪問并可能操作各種資料項的一個資料庫操作序列,這些操作要么全部執行,要么全部不執行,是一個不可分割的作業單位,事務由事務開始與事務結束之間執行的全部資料庫操作組成;
簡言之:
要么都成功,要么都失敗,
ACID
資料庫事務正確執行的四個基本原則的縮寫;
包含:
原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability),
一個支持事務的資料庫(例如:INNODB引擎),必須要具有這四種特性,
以經典的銀行轉賬為例略談一下
原子性
事務中的全部操作在資料庫中是不可分割的,要么全部完成,要么全部不執行,
例:A用戶給B用戶轉賬500元
| 銀行 | 執行 | 結果 |
|---|---|---|
| A用戶(1000元) | 1000-500 | 500 |
| B用戶(500元) | 500+500 | 1000 |
在轉賬程序中,這兩個步驟只能成功或失敗,不得出現一個用戶資金有變動而另一個用戶資金沒變動的情況,
一致性
幾個并行執行的事務,其執行結果必須與按某一順序串行執行的結果相一致,
| 銀行 | 執行 | 結果 |
|---|---|---|
| A用戶(1000元) | 1000-500 | 500 |
| B用戶(500元) | 500+500 | 1000 |
| 總計(1500元) | 1500 | 1500 |
在整個操作程序中,其兩個用戶的資金總額是恒定不變的,
隔離性
事務的執行不受其他事務的干擾,事務執行的中間結果對其他事務必須是透明的,
例:A用戶給B用戶轉賬500元,C用戶給B用戶轉賬500元
| 銀行 | 執行 | 結果 |
|---|---|---|
| A用戶(1000元) | 1000-500 | 500 |
| B用戶(500元) | 500+500 | 1000 |
| 銀行 | 執行 | 結果 |
|---|---|---|
| C用戶(1000元) | 1000-500 | 500 |
| B用戶(500元) | 500+500 | 1000 |
| 銀行 | 最終結果 |
|---|---|
| A用戶 | 500 |
| B用戶 | 1500 |
| C用戶 | 500 |
在多用戶進行操作的時候,主要是排除其他用戶對自身的一個影響,
持久性
對于任意已提交事務,系統必須保證該事務對資料庫的改變不被丟失,
如在提交一組事務的時候遇到服務器崩潰或者斷電,若事務未完成提交,則恢復到原來的狀態;若事務已完成提交,則持久化到資料庫中;
事務一旦提交,便不可逆,
事務并發問題
資料庫是要被廣大客戶所共享訪問的,那么在資料庫操作程序中不考慮隔離問題的話很可能誘發一些非常情況,
臟讀
一個事務讀取到了另一個事務未提交的資料操作結果,
在A給B完成轉賬的時候,B是1000元,但是在C給B轉賬的時候,讀取到的是A未給B轉賬前的資料(500元),結果造成了兩邊資料不對等情況;
這種情況相當危險,因為很可能所有的操作都被回滾,
不可重復讀
一個事務對同一行資料重復讀取多次,但是卻得到結果不同,
第一次讀取值:
| 用戶 | 資金 |
|---|---|
| A | 1000 |
| B | 500 |
第二次讀取值:A用戶有入賬情況
| 用戶 | 資金 |
|---|---|
| A | 2000 |
| B | 500 |
第三次讀取值:B用戶有支出情況
| 用戶 | 資金 |
|---|---|
| A | 1000 |
| B | 200 |
不可重復讀不一定是錯誤,也可能是讀取時間的問題所導致;
虛讀(幻讀)
一個事務內讀取到了別的事務插入的資料,導致前后讀取不一致,
第一次讀取值:
| 用戶 | 資金 |
|---|---|
| A | 1000 |
| B | 500 |
第二次讀取值:多了一條記錄
| 用戶 | 資金 |
|---|---|
| A | 2000 |
| B | 500 |
| D | 1000 |
虛讀一般無較大影響,一般為行影響,
事務隔離級別
在資料庫操作中,為了有效保證并發讀取資料的正確性,提出的事務隔離級別;在標準SQL規范中,定義了四種事務隔離級別:
讀未提交(READ UNCOMMITTED)、讀提交 (READ COMMITTED)、
可重復讀 (REPEATABLE READ)、串行化 (SERIALIZABLE),
不同的隔離級別對事務的處理不同,從上往下,隔離強度逐漸增強,性能逐漸變差,其中,可重復讀是 MySQL 的默認隔離級別,
| 隔離級別 | 臟讀 | 不可重復讀 | 虛讀(幻讀) |
|---|---|---|---|
| 讀未提交 | √ | √ | √ |
| 讀提交 | × | √ | √ |
| 可重復讀 | × | × | √ |
| 串行化 | × | × | × |
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/257520.html
標籤:其他
上一篇:mysql事務相關復習
下一篇:Mysql約束
