事務(Transaction),通常是指要作的或所作的事情。在計算機術語中是指訪問並可能更新數據庫中各類數據項的一個程序執行單元(unit)。在計算機術語中,事務一般就是指數據庫事務。數據庫
一個數據庫事務一般包含對數據庫進行讀或寫的一個操做序列。它的存在包含有如下兩個目的:併發
一、爲數據庫操做提供了一個從失敗中恢復到正常狀態的方法,同時提供了數據庫即便在異常狀態下仍能保持一致性的方法。
二、當多個應用程序在併發訪問數據庫時,能夠在這些應用程序之間提供一個隔離方法,以防止彼此的操做互相干擾。spa
當一個事務被提交給了DBMS(數據庫管理系統),則DBMS須要確保該事務中的全部操做都成功完成且其結果被永久保存在數據庫中,若是事務中有的操做沒有成功完成,則事務中的全部操做都須要被回滾,回到事務執行前的狀態(要麼全執行,要麼全都不執行);同時,該事務對數據庫或者其餘事務的執行無影響,全部的事務都好像在獨立的運行。操作系統
但在現實狀況下,失敗的風險很高。在一個數據庫事務的執行過程當中,有可能會趕上事務操做失敗、數據庫系統/操做系統失敗,甚至是存儲介質失敗等狀況。這便須要DBMS對一個執行失敗的事務執行恢復操做,將其數據庫狀態恢復到一致狀態(數據的一致性獲得保證的狀態)。爲了實現將數據庫狀態恢復到一致狀態的功能,DBMS一般須要維護事務日誌以追蹤事務中全部影響數據庫數據的操做。日誌
並不是任意的對數據庫的操做序列都是數據庫事務。事務應該具備4個屬性:原子性、一致性、隔離性、持久性。這四個屬性一般稱爲ACID特性。事務
原子性(Atomicity):事務做爲一個總體被執行,包含在其中的對數據庫的操做要麼所有被執行,要麼都不執行。
一致性(Consistency):事務應確保數據庫的狀態從一個一致狀態轉變爲另外一個一致狀態。一致狀態的含義是數據庫中的數據應知足完整性約束。
隔離性(Isolation):多個事務併發執行時,一個事務的執行不該影響其餘事務的執行。
持久性(Durability):一個事務一旦提交,他對數據庫的修改應該永久保存在數據庫中。ci
用一個經常使用的「A帳戶向B帳號匯錢」的例子來講明如何經過數據庫事務保證數據的準確性和完整性。熟悉關係型數據庫事務的都知道從賬號A到賬號B須要6個操做:it
一、從A帳號中把餘額讀出來(500)。
二、對A帳號作減法操做(500-100)。
三、把結果寫回A帳號中(400)。
四、從B帳號中把餘額讀出來(500)。
五、對B帳號作加法操做(500+100)。
六、把結果寫回B帳號中(600)。io
保證1-6全部過程要麼都執行,要麼都不執行。一旦在執行某一步驟的過程當中發生問題,就須要執行回滾操做。 假如執行到第五步的時候,B帳戶忽然不可用(好比被註銷),那麼以前的全部操做都應該回滾到執行事務以前的狀態。程序
在轉帳以前,A和B的帳戶中共有500+500=1000元錢。在轉帳以後,A和B的帳戶中共有400+600=1000元。也就是說,數據的狀態在執行該事務操做以後從一個狀態改變到了另一個狀態。同時一致性還能保證帳戶餘額不會變成負數等。
在A向B轉帳的整個過程當中,只要事務尚未提交(commit),查詢A帳戶和B帳戶的時候,兩個帳戶裏面的錢的數量都不會有變化。
若是在A給B轉帳的同時,有另一個事務執行了C給B轉帳的操做,那麼當兩個事務都結束的時候,B帳戶裏面的錢應該是A轉給B的錢加上C轉給B的錢再加上本身原有的錢。
一旦轉帳成功(事務提交),兩個帳戶的裏面的錢就會真的發生變化(會把數據寫入數據庫作持久化保存)!
一致性與原子性是密切相關的,原子性的破壞可能致使數據庫的不一致,數據的一致性問題並不都和原子性有關。
好比剛剛的例子,在第五步的時候,對B帳戶作加法時只加了50元。那麼該過程能夠符合原子性,可是數據的一致性就出現了問題。
所以,事務的原子性與一致性缺一不可。