數據庫“事務”基礎知識學習(一)

之前學數據庫的時候沒太注意事務這個概念,在平時練習的時候也基本上沒用到,但是這是一個非常有用的概念,值得好好學習。這篇文章主要講的是關於事務概念的非常基礎的知識以及用JDBC來管理事務,不涉及事務的一些高級概念。

一、數據庫“事務”概述

==數據庫事務( transaction)==是指訪問並可能操作各種數據項的一個數據庫操作序列,這些操作要麼全部執行,要麼全部不執行,是一個不可分割的工作單位。事務由事務開始與事務結束之間執行的全部數據庫操作組成。
簡單來說,事務可以理解爲這樣的一組操作集合:對於某些操作之間,若不能“同步”,便會帶來嚴重錯誤,於是將這些操作組成一個事務,然後管理事務來統一管理這個操作。例如,在購物時,有兩個基本操作:付錢和交貨。如果付了錢不交貨或不付錢就交貨,這都會引起錯誤。此時便可以把付錢和交貨這兩個操作組成一個事務來處理(注意規定付錢在前,交貨在後,付錢後一定交貨),這樣便可避免由於操作不同步而產生的錯誤。

二、數據庫“事務”的特點

  • 原子性
    事務中的全部操作在數據庫中是不可分割的,要麼全部完成,要麼全部不執行

  • 一致性
    幾個並行執行的事務,其執行結果必須與按某一順序 串行執行的結果相一致

  • 隔離性
    併發執行的事務不會相互影響,其對數據庫的影響和它們串行執行時一樣

  • 持久性
    事務一旦提交,其對數據庫的更新就是持久的,任何事務或系統故障都不會導致數據丟失

三、數據庫常見併發異常

  • 丟失修改
    一個事務覆蓋了其他事務對數據的已提交修改,導致這些修改好像丟失了一樣

  • 髒讀
    一個事務讀取了其他事務還未提交的數據

  • 不可重複讀
    一個事務對同一數據的讀取結果前後不一致

  • 幻讀
    一個事務讀取某個範圍的數據時,因爲其他事務的操作導致前後兩次讀取的結果不一致。幻讀和不可重複讀的區別在於,不可重複讀是針對確定的某一行數據而言,而幻讀是針對不確定的多行數據。

數據庫事務的存在一方面本身就是爲了減少錯誤,另一方面通過事務處理可以在發生錯誤時很方便地恢復到錯誤發生前的狀態。
爲了避免出現上面的異常,可通過事務的隔離級別來處理,有關隔離級別的內容,可參考大佬的博客事務的四種隔離級別,這裏暫不做討論。

四、數據庫“事務”的基本操作

  • 開啓
  • 提交
  • 回滾
    當發生數據庫錯誤時,需要將數據庫恢復到發生錯誤前的狀態。

在JDBC裏面,使用Connection對象來管理事務:

  • setAutoCommit(false)
    表示開啓事務

  • commit()
    提交結束事務

  • rollback()
    回滾結束事務

代碼格式如下

try{
     con.setAutoCommit(false);//開啓事務
     ......
     con.commit();//try的最後提交事務      
} catch() {
    con.rollback();//回滾事務
}

在這裏插入圖片描述
2019.12.22

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章