天天看點

關于資料庫操作的事務  1.事務的概念:

  1.事務的概念:

   對一組sql進行統一的送出或復原操作,為了保證資料執行的一緻性;(如果一個連續的操作中,所有的步驟全部成功執行,整個操作才算完成;如果有一個步驟失敗,那麼所有操作都失敗)典型例子就是銀行轉賬問題,要麼一方扣一方存,要麼全部不操作。

  2.事務的四大特性:

原子性:事務不可分割。要麼全做,要麼不做 一緻性:一緻性是指事務必須使資料庫從一個一緻性狀态變換到另一個一緻性狀态,比如甲乙進行轉賬,轉賬前後甲乙資産的總和是一緻的 持久性:事務能夠将資料持久化到資料庫中; 持久性是指一個事務一旦被送出了,那麼對資料庫中的資料的改變就是永久性的,即便是在資料庫系統遇到故障的情況下也不會 丢失送出事務的操作。 例如我們在使用JDBC操作資料庫時,在送出事務方法後,提示使用者事務操作完成,當我們程式執行完成直到看到提示後,就可以 認定事務以及正确送出,即使這時候資料庫出現了問題,也必須要将我們的事務完全執行完成,否則就會造成我們看到提示事務處理 完畢,但是資料庫因為故障而沒有執行事務的重大錯誤。 隔離性:多個事務操作資料時,可能出現的一些隔離性問題;事務操作一條資料時,其他事務隻能等待其操作完成後才能對該資料 進行操作修改,即多個并發的事務之間要互相隔離; 3.事務控制時如果不考慮事務的隔離性,容易出現的幾種問題: (1) 髒讀:一個事務正在對一條記錄做修改,在這個事務完成并送出前,這條記錄的資料就處于不一緻狀态;這時,另一個事務 也來讀取同一條記錄,如果不加控制,第二個事務讀取了這些“髒”資料,并據此做進一步的處理,就會産生對未送出的資料 依賴關系。這種現象被形象地叫做"髒讀"。準确來說,就是B事務讀取了另一個事務A進行中但未處理完的資料; (2) 不可重複讀:一個事務執行過程中,在讀取某些資料後的某個時間,再次讀取以前讀過的資料,卻發現其讀出的資料已經發 生了改變、或某些記錄已經被删除了,這種現象就叫做“不可重複讀”;一個事務範圍内多次查詢同一卻傳回了 不同的資料值,這是由于在查詢間隔,被另一個事務修改并送出了。 髒讀和不可重複讀的差別在于:髒讀是某一事務讀取了另一事務未送出的髒資料;而不可重複讀是某一事務讀取了前一事務送出的資料   (3) 幻讀:事務在非獨立執行的情況下會發生幻讀。在一個事務裡,查詢的結果都是事務開始時的狀态(保證了同一事務内的可重複讀),但是如果另一個事務同時送出了資料,本事務更新時會驚奇的發現這些資料,貌似之前發生的讀取結果是幻覺一樣;(類似的說法:一個事務按相同的查詢條件重新讀取以前檢索過的資料,卻發現其他事務插入了滿足其查詢條件的新資料,這種現象 就稱為“幻讀”。(網上大部分人說法)) 幻讀和不可重複讀的差別在于:不可重複讀表述的是對于一條資料記錄前後結果的不一緻;幻讀是針對某一查詢的結果集前後數目不同;

  4.事務的四個隔離級别:

(1) Serializable (串行化) : 避免了幻讀、不可重複讀、髒讀 (2) Repeatable read(可重複讀):避免了不可重複讀、髒讀--Mysql預設 這是MySQL的預設事務隔離級别,它確定同一事務的多個執行個體在并發讀取資料時,會看到同樣的資料行。不過這還會導緻 另一個問題:幻讀 (Phantom Read)。使用者讀取某一範圍的資料行時,另一個事務又在該範圍内插入了新行,當使用者再 讀取該範圍的資料行時,會發現有新的“幻影” 行。InnoDB和Falcon存儲引擎通過多版本并發控制(MVCC, Multiversion Concurrency Control)機制解決了該問題。故在進行事務控制時要保證資料庫的存儲引擎為InnoDB等支援事務 的引擎,如果是myisam,事務是不起作用的 (3) Read committed (已送出讀):避免了髒讀--Oracle預設 一個事務隻能看見已經送出事務所做的改變。這種隔離級别會産生不可重複讀問題(Nonrepeatable Read),因為 同一事務的其他執行個體在該執行個體處理其間可能會有新的commit,是以同一select可能傳回不同結果。  (4) Read uncommitted(未送出讀,任何情況都無法保證) Mysql和Oracle中支援的事務隔離級别 在MySQL資料庫中,支援上面四種隔離級别,預設的為Repeatable read (可重複讀); 而在Oracle資料庫中,隻支援Serializable (串行化)級别和Read committed (讀已送出)這兩種級别,其中預設的為Read committed級别。

5.事務分類: 

   根據事務的編寫位置 : 

    全局事務

    在伺服器[tomcat]中配置的事務管理過程

    JTA  java transaction api

    特點 : 可以跨越多個connection連接配接

        ** 如果用戶端一次請求的過程中,需要多個資料源連接配接資料庫

    局部事務

    在工程中配置的事務 

    特點 : 事務的配置方式依賴持久層采用的底層技術

        ** 隻能局限在一次connection連接配接中,連接配接建立 事務建立 ; 連接配接終止,事務銷毀

  根據事務的編寫方式 : 

程式設計式事務

在核心代碼中以編碼的形式控制事務

session.beginTransaction()

commit() rollback()

聲明式事務

AOP  事務通知bean 切入點... 或者 @Transactional注解