資料庫事務的屬性-ACID
1、資料庫事務的屬性-ACID(四個英文單詞的首寫字母):
1)原子性(Atomicity)
所謂原子性就是將一組操作作為一個操作單元,是原子操作,即要麼全部執行,要麼全部不執行。
2)一致性(Consistency)
事務的一致性指的是在一個事務執行之前和執行之後資料庫都必須處於一致性狀態。如果事務成功地完成,那麼系統中所有變化將正確地應用,系統處於有效狀態。如果在事務中出現錯誤,那麼系統中的所有變化將自動地復原,系統返回到原始狀態。
3)隔離性(Isolation)
隔離性指並發的事務是相互隔離的。即一個事務內部的操作及正在操作的資料必須封鎖起來,不被其它企圖進行修改的事務看到。
4)持久性(Durability)
持久性是指一個事務一旦被提交,它對資料庫中資料的改變就是永久性的,接下來的其他動作和資料庫故障不應該對其有任何影響。即一旦一個事務提交,DBMS(Database Management System)保證它對資料庫中資料的改變應該是永久性的,持久性通過Database Backup和恢複來保證。
2、在關係型資料庫中,事務的隔離性分為四個隔離等級,在解讀這四個層級前先介紹幾個關於讀資料的概念。
1)髒讀(Dirty Reads):所謂髒讀就是對髒資料(Drity Data)的讀取,而髒資料所指的就是未提交的資料。也就是說,一個事務正在對一條記錄做修改,在這個事務完成並提交之前,這條資料是處於待定狀態的(可能提交也可能復原),這時,第二個事務來讀取這條沒有提交的資料,並據此做進一步的處理,就會產生未提交的資料依賴關係。這種現象被稱為髒讀。
2)不可重複讀取(Non-Repeatable Reads):一個事務先後讀取同一條記錄,但兩次讀取的資料不同,我們稱之為不可重複讀取。也就是說,這個事務在兩次讀取之間該資料被其它事務所修改。
3)幻讀(Phantom Reads):一個事務按相同的查詢條件重新讀取以前檢索過的資料,卻發現其他事務插入了滿足其查詢條件的新資料,這種現象就稱為幻讀。
3、事務四個隔離等級對比:
1)未提交讀(Read Uncommitted):SELECT語句以非鎖定方式被執行,所以有可能讀到髒資料,隔離等級最低。
2)提交讀(Read Committed):只能讀取到已經提交的資料。即解決了髒讀,但未解決不可重複讀取。
3)可重複讀(Repeated Read):在同一個事務內的查詢都是事務開始時刻一致的,InnoDB的預設層級。在SQL標準中,該隔離等級消除了不可重複讀取,但是還存在幻讀。
4)串列讀(Serializable):完全的序列化讀,所有SELECT語句都被隱式的轉換成SELECT ... LOCK IN SHARE MODE,即讀取使用表級共用鎖定,讀寫相互都會阻塞。隔離等級最高。
隔離等級對比表:
4、交易隔離等級的設定:
1)服務啟動選項--transaction-isolation或在設定檔中設定:
[mysqld]
transaction-isolation = {READ-UNCOMMITTED | READ-COMMITTED
| REPEATABLE-READ | SERIALIZABLE}
2)服務啟動後的設定:
SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL
{ READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }