事務是一組單元化的操做,這組操做能夠保證要麼所有成功,要麼所有失敗(只要有一個失敗的操做,就會把其餘已經成功的操做回滾)。數據庫
通常所說的數據庫事務,它是訪問並可能更新數據庫中各類數據項的一個程序執行單元,由一個有限的數據庫操做序列構成。當事務被提交給了DBMS(數據庫管理系統),則DBMS(數據庫管理系統)須要確保該事務中的全部操做都成功完成且其結果被永久保存在數據庫中,若是事務中有的操做沒有成功完成,則事務中的全部操做都須要被回滾,回到事務執行前的狀態;同時,該事務對數據庫或者其餘事務的執行無影響,全部的事務都好像在獨立的運行。併發
所謂的原子性就是說,在整個事務中的全部操做,要麼所有完成,要麼所有不作,沒有中間狀態。對於事務在執行中發生錯誤,全部的操做都會被回滾,整個事務就像從沒被執行過同樣。 spa
事務的執行必須保證系統的一致性,就拿轉帳爲例,A有300元,B有100元,若是在一個事務裏A成功轉給B50元,那麼無論併發多少,無論發生什麼,只要事務執行成功了,那麼最後A帳戶必定是250元,B帳戶必定是150元。 日誌
所謂的隔離性就是說,事務與事務之間不會互相影響,一個事務的中間狀態不會被其餘事務感知。 即要達到這麼一種效果:對於任意兩個併發的事務T1和T2,在事務T1看來,T2要麼在T1開始以前就已經結束,要麼在T1結束以後纔開始,這樣每一個事務都感受不到有其餘事務在併發地執行。事務有多種隔離級別。code
所謂的持久性,就是說一旦事務完成了,那麼事務對數據所作的變動就徹底保存在了數據庫中,即便發生停電,系統宕機也是如此。blog
事務的原子性、一致性和持久性,數據庫管理系統採用日誌來保證。日誌記錄了事務對數據庫所作的操做,若是某個事務在執行過程當中發生錯誤,就能夠根據日誌,撤銷事務對數據庫已作的操做,使數據庫退回到執行事務前的初始狀態。事務
事務的隔離性,數據庫管理系統採用鎖機制來實現。當多個事務同時更新數據庫中相同的數據時,只容許持有鎖的事務能更新該數據,其餘事務必須等待,直到前一個事務釋放了鎖,其餘事務纔有機會更新該數據。class
特別說明:原子性並不能保證一致性,因此有了原子性爲何還要一致性date
對於單個事務,原子性就能保證一致性,可是對於多個併發執行的事務,即便每一個事務都是原子執行的,但它們同時執行的話,最終效果可能會不一致。舉例以下:程序
有A、B、C三個帳戶各有200元錢,其中事務1是A向B轉帳100,則執行語句以下:
update A set amount=amount-100 where id = 1; update B set amount=amount+100 where id = 1;
事務2是C向B轉帳100,則執行語句以下:
update C set amount=amount-100 where id = 1; update B set amount=amount+100 where id = 1;
若是事務1和事務2同時執行的一致性結果應該是B帳戶裏面有300元錢,可是在併發事務下,事務1和事務2同時執行時,兩個事務讀到的帳戶B的當前金額均可能是100(髒讀),無論兩個事務誰先執行完成,最終的執行結果都是B帳戶金額爲200。這就是事務特性除了原子性外還須要一致性。所以,要達到事務的一致性,除了要保證單個事務的原子性以外,還要保證事務之間的隔離性