數據庫事務( transaction)是訪問並可能操做各類數據項的一個數據庫操做序列,這些操做要麼所有執行,要麼所有不執行,是一個不可分割的工做單位。事務由事務開始與事務結束之間執行的所有數據庫操做組成mysql
原子性是指事務是一個不可分割的單位,要麼都發生,要麼都不發生
想要保證事務的原子性,就須要在異常發生時,對已經執行的操做進行回滾,而在 MySQL 中,恢復機制是經過回滾日誌(undo log)實現的,全部事務進行的修改都會先記錄到這個回滾日誌中,而後在對數據庫中的對應行進行寫入。
回滾日誌除了可以在發生錯誤或者用戶執行 ROLLBACK 時提供回滾相關的信息,它還可以在整個系統發生崩潰、數據庫進程直接被殺死後,當用戶再次啓動數據庫進程時,還可以馬上經過查詢回滾日誌將以前未完成的事務進行回滾,這也就須要回滾日誌必須先於數據持久化到磁盤上,是咱們須要先寫日誌後寫數據庫的主要緣由。
回滾日誌並不能將數據庫物理的恢復到執行語句或事務以前的樣子,他是邏輯日誌。sql
一致性是指應用從一個正確的狀態到另一個正確的狀態。ACID就是經過AID來保證C的。如何理解正確的狀態呢?正確的狀態就是咱們須要約定的一些約束,好比張三帳戶有90元,若是他買東西須要花費100元,則買完之後帳戶餘額就是-10元,那麼-10元是否是一個正確的狀態呢?答案是的。這是由於咱們並無約定帳戶字段不能爲負。
多個事務並行處理時,相互應該沒有影響
隔離級別:
1.讀未提交
2.讀已提交
3.可重複讀(innodb)
4.串行化數據庫
髒讀:讀到其餘事務未提交的更新數據,
幻讀:一個事務,讀取兩次,獲得的記錄條數不一致
不可重複讀: 重複讀取後數據不一致多線程
其實也是多線程問題。因此使用併發控制機制,限制不一樣事務對同一資源的讀寫。這裏介紹三種最重要的併發控制器機制的工做原理。
1.鎖
mysql提供兩種鎖,共享鎖和互斥鎖,也叫讀鎖和寫鎖
2.時間戳
使用時間戳的話,就是樂觀鎖的實現方式,寫入數據的時候先對數據進行修改,再判斷時間戳是否變化過,若是沒有,就更新,變了的話,就生成新的時間戳再次更新數據
3.多版本和快照隔離
經過維護多個版本的數據,數據庫能夠容許事務在數據被其餘事務更新 時,去讀取舊版本的數據。併發
持久性是指一旦事務被提交,他對數據庫中數據的改變就是永久性的。
Active:事務的初始狀態,表示事務正在執行;
Partially Commited:在最後一條語句執行以後;
Failed:發現事務沒法正常執行以後;
Aborted:事務被回滾而且數據庫恢復到了事務進行以前的狀態以後;
Commited:成功執行整個事務;spa