數據庫事務(transanction)正確執行的四個基本要素。
ACID。原子性(Atomicity)、一致性(Correspondence)、隔離性(Isolation)、持久性(Durability)。
- 原子性:整個事務中的所有操作,要么全部完成,要么全部不完成,不可能停滯在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。
- 一致性:在事務開始之前和事務結束以后,數據庫的完整性約束沒有被破壞。
- 隔離性:隔離狀態執行事務,使它們好像是系統在給定時間內執行的唯一操作。如果有兩個事務,運行在相同的時間內,執行相同的功能,事務的隔離性將確保每一事務在系統中認為只有該事務在使用系統。這種屬性有時稱為串行化,為了防止事務操作間的混淆,必須串行化或序列化請 求,使得在同一時間僅有一個請求用于同一數據。
- 持久性:在事務完成以后,該事務所對數據庫所作的更改便持久的保存在數據庫之中,并不會被回滾。
并發事務帶來的問題
相對于串行處理來說,并發事務處理能大大增加數據庫資源的利用率,提高數據庫系統的事務吞吐量,從而可以支持可以支持更多的用戶。但并發事務處理也會帶來一些問題,主要包括以下幾種情況。
- 更新丟失(Lost Update):當兩個或多個事務選擇同一行,然后基于最初選定的值更新該行時,由于每個事務都不知道其他事務的存在,就會發生丟失更新問題——最后的更新覆蓋了其他事務所做的更新。
- 臟讀(Dirty Reads):一個事務正在對一條記錄做修改,在這個事務并提交前,這條記錄的數據就處于不一致狀態;這時,另一個事務也來讀取同一條記錄,如果不加控制,第二個事務讀取了這些“臟”的數據,并據此做進一步的處理,就會產生未提交的數據依賴關系。這種現象被形象地叫做“臟讀”。
- 不可重復讀(Non-Repeatable Reads):一個事務在讀取某些數據已經發生了改變、或某些記錄已經被刪除了!這種現象叫做“不可重復讀”。
- 幻讀(Phantom Reads):一個事務按相同的查詢條件重新讀取以前檢索過的數據,卻發現其他事務插入了滿足其查詢條件的新數據,這種現象就稱為“幻讀”。
事物的4種隔離級別
- 1、讀未提交(RU)
- 2、讀已提交(RC)
- 3、可重復讀(RR)
- 4、串行
事物的4種隔離級別依次會出現的事務問題
更新丟失 | 臟讀 | 不可重復讀 | 幻讀 | |
---|---|---|---|---|
讀未提交 | 不存在 | 存在 | 存在 | 存在 |
讀已提交 | 不存在 | 不存在 | 存在 | 存在 |
可重復讀 | 不存在 | 不存在 | 不存在 | 存在 |
串行 | 不存在 | 不存在 | 不存在 | 不存在 |
MySQL中myisam與innodb的區別
1.InnoDB支持事物,而MyISAM不支持事物
2.InnoDB支持行級鎖,而MyISAM支持表級鎖
3.InnoDB支持MVCC, 而MyISAM不支持
4.InnoDB支持外鍵,而MyISAM不支持
5.InnoDB不支持全文索引,而MyISAM支持。
相對于其他的數據庫而言,MySQL的鎖機制比較簡單,最顯著的特點就是不同的存儲引擎支持不同的鎖機制。根據不同的存儲引擎,MySQL中鎖的特性可以大致歸納如下:
行鎖 | 表鎖 | 頁鎖 | |
---|---|---|---|
MyISAM | √ | ||
BDB | √ | √ | |
InnoDB | √ | √ |