資料庫事務的四大特性
原子性
事務包含的所有操作要麼成功,要麼失敗復原
一緻性
事務必須是資料庫從一個一緻性狀态到另一個一緻性狀态。
事務執行之前和之後必須都是一緻性的一個狀态
隔離性
當多個使用者并發通路資料庫,比如同一張表時,資料庫為每一個使用者開啟的事務,
不會被其他事務的操作幹擾,多個并發事務之間要互相隔離
持久性
事務一旦被送出,那麼資料庫的資料改變是永久性的,即便是資料庫遇到故障的時候也不會丢失事務操作。
資料庫事務的隔離級别
資料庫有4中事務隔離級别,分别從低到搞為:
Read uncommitted(讀,未送出)
Read committed(讀,已送出)
Repetablead(可重複讀)
Serializable(序列化又名串行化)
讀、未送出(Read uncommitted)
一個事務可以讀取到另一個未送出事務的資料
解決--髒讀
例:a轉給b 500元,a已經下發,但是沒有送出,此時b可以檢視到到了500,a由于未送出事務,此時測回,可導緻a已經見到500到賬,但是又沒有了。
此時就可使用Read committed(讀、已送出)解決資料髒讀問題。
讀、已送出(Read committed)
事務要等待另一個事務送出後才能讀取資料。
解決--不可重複讀
例:a事務要進行扣款(之前已經讀取過資料),但是b事務正在進行中,需要等待b事務進行處理完成,直到b事務處理完成之後,b事務結束,此時a事務才能重新繼續處理,然而此時就需要重讀資料,導緻資料不正确。
讀送出的時候,需要等到其他update操作完成才能讀取資料,可以解決髒讀問題,
但是這裡一個事務範圍内兩個相同的查詢傳回了不同的資料,這個就是不可重複讀。
重複讀(Repeatable read)
重複讀,就是在開始讀取資料(事務開啟)時,就不再允許修改操作,MySQL是這一級别的。
解決--重複讀
a事務進行扣款(開啟重複讀事務),此時b事務就無法對資料進行處理,需要等待a事務處理完成之後再次進行資料處理。
重複讀可以解決不可重複讀的問題,其實不可重複讀就是針對update操作的。
但是可能會出現幻讀問題,**幻讀**是針對insert操作。
什麼是幻讀?
是a事務在開啟了重複讀的時候,b插入了一條資料,此時可能會出現資料幻讀。因為重複讀隻針對update操作,幻讀是針對insert操作。
序列化(Serializable)
解決幻讀
序列化時最高的事務隔離級别,在該級别下,事務串行順序執行,可以避免髒讀、不可重複讀、幻讀。
但是這種事務隔離級别效率底下,比較消耗資料庫性能。
資料庫預設的事務
大多數資料庫的事務隔離級别是Read committed
資料庫 | 預設事務級别 |
---|---|
Sql Server | Read committed(讀、已送出) |
Oracle | Read committed(讀、已送出) |
MySQL | Repeatable(可重複讀) |