一、acid?
atomicity
? ? 原子性 :一個事務被視為一個不可分割的最小工作單元,整個事務要么全執行,要么全部失敗回滾。
consistency
? ? 一致性:數據庫總是從一個一致性的狀態轉換到另一個一致性的狀態。例如,即使取錢操作失敗,因為事務沒有提交,所以事務所做的修改也不會保存到數據庫中,數據還是事務執行前的狀態。如果事務執行成功,那數據就是執行后的狀態,保持不變。
isolation
? ? 隔離性:一個事務所做的修改在提交之前,對其他事務是不可見的。
durability
? ? 持久性:一旦事務提交,則其所做的修改會永久的保存到數據庫中。
注意
? ? 正如鎖的粒度升級會增加系統開銷一樣,事務處理過程也需要數據庫系統做更多額外的工作。一個支持ACID的db通常比不需要支持ACID的數據庫對CPU的處理能力要求更高、需要更多的內存和磁盤空間。所以用戶可以通過不同的應用場景,選擇mysql多樣的數據庫引擎,靈活應變。 ? ?
二、隔離級別
? ??在SQL標準中定義了4中隔離級別。每一種級別的事務隔離性對應著,該事務所做的修改在事務內部、事務之間的可見性。隔離級別越低,并發性越強,系統開銷越低。
Read Uncommitted
? ??未提交讀:該隔離級別的事務,在數據修改過程中,即使沒有提交,其他事務對于這些數據也是可讀的。事務可讀到未提交的數據也叫臟讀(Dirty Read),由于臟讀在實際應用中會導致很多問題,一般這類隔離級別應用很少。
Read Committed
? ??提交讀:(一般數據庫默認事務級別)只有當前事務執行完,把數據提交之后,其他事務才可對這些數據進行讀取。也叫不可重復讀,因為其他事務執行2次查詢可能前后會得到2個不同結果(事務執行前讀一次,執行后讀一次)。
Repeatable Read
? ??可重復讀:(Mysql的默認隔離級別)解決了臟讀的問題,該級別保證了在同一事務中,多次讀取的結果是一致的。但仍舊無法解決幻讀問題。幻讀:事務A在讀取一定范圍內數據時,事務B有對該范圍數據進行插入等更新操作,事務A再次讀取該范圍記錄時,會產生幻讀(Phantom Read)。
Serializable?
? ??可串行化:在讀取每一行數據時,都加上鎖,強制事務串行執行,避免幻讀問題。但容易產生超時和鎖競爭問題。應用也相對較少,只有在特別需要保證數據一致性且無并發的情況下才使用該級別。
三、Mysql設置事務隔離級別
? ??set transaction isolation level read committed;
? ??新的隔離級別會在下一個事務開始執行時生效。如果需要修改當前事務的隔離級別,可對配置文件進行修改。另外,?在上篇博客中對mysql提供的兩種支持事務的存儲引擎:InnoDB和NDB Cluster有所介紹。 ?
?以上就是MySQL數據庫優化(二)—MySQL事務?的內容,更多相關內容請關注PHP中文網(www.php.cn)!