事務(Transaction
)是數據庫區別於文件系統的重要特性之一。 sql
數據庫引入事務的主要目的:事務會把數據庫從一種抑制狀態轉換爲另外一種一致狀態。在數據庫提交工做時,這種機制可以保證在一組的sql語句要麼都成功執行、要麼都不執行。數據庫
事務用來保證數據庫的完整性性能
atomicity
):事務中全部操做要麼所有成功,要麼所有失敗consistency
):從一種狀態轉變爲下一種一致狀態。事務開始前和結束後,數據庫的完整性約束沒有被破壞。isolation
):一個事務的影響在提交前對其餘事務都不可見Durability
):一旦提交,結果就是永久性的。InnoDB
中的事務徹底符合ACID
的特性atom
數據庫事務的隔離級別有4種,由低到高分別是:spa
Read uncommitted
)read committed
)repeatable read
)Serializable
)
Read uncommitted
)容許髒讀,就是一個事務能夠讀取另外一個未提交事務的數據。code
eg:對象
老闆要給員工發工資,員工的工資是3000/月。可是發工資時老闆不當心按錯了數字,按成5000/月,可是該事務尚未提交,就在這時,員工去查看本身這個月的工資,發現(5000)比往常多了2千元,覺得漲工資了很是高興。
read committed
)只能讀取到已經提交的數據(就是事務要等另外一個事物提交後才能讀取數據)
eg:blog
小明拿着工資卡去超市購物(卡里固然是隻有3000),當他賣單時(事務開啓),收費系統事先檢測到他的卡里有3000,就在這個時候!!小明的對象把卡里的錢所有轉了出去,並提交事物(提交完成)。當收費系統準備扣款時,再檢測卡里的金額,發現已經沒錢了。
repeatable read
)就是在開始讀取數據(事物開啓)時,再也不容許修改操做。事務
eg:ci
小明拿着工資卡去超市購物(卡里固然是隻有3000),當他賣單時(事務開啓,不容許其餘事務的UPDATE修改操做),收費系統事先檢測到他的卡里有3000。這個時候任何人不能轉出金額了。接下來收費系統就能夠扣款了。
Serializable
)最高的事務隔離級別,在該級別下,事務串行化順序執行,讀寫相互都會阻塞。可是這種事務隔離級別效率低下,比較耗數據庫性能,通常不用。
eg:
小明拿着工資卡去ATM機(卡里固然是隻有3000),當他取錢時(事務開啓),ATM查詢到他的卡里有3000。這個時候在向卡里存200。此時 只有當查的事物完成時,存的事物纔會執行。
簡單來講: 事物就是在數據庫提交工做時,要麼全部修改都保存,要麼全部修改都不保存。