[原創]java WEB學習筆記78:Hibernate學習之路---session概述,session緩衝(hibernate 一級緩衝),資料庫的隔離等級,在 MySql 中設定隔離等級,在 Hibernate 中設定隔離等級

來源:互聯網
上載者:User

標籤:

本部落格的目的:①總結自己的學習過程,相當於學習筆記 ②將自己的經驗分享給大家,相互學習,互相交流,不可商用內容難免出現問題,歡迎指正,交流,探討,可以留言,也可以通過以下方式聯絡。本人互連網技術愛好者,互連網技術發燒友微博:伊直都在0221QQ:951226918

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1.Session 概述

  1)Session 介面是 Hibernate 嚮應用程式提供的操縱資料庫的最主要的介面, 它提供了基本的儲存, 更新, 刪除和載入 Java 對象的方法.

  2)Session 具有一個緩衝, 位於緩衝中的對象稱為持久化對象, 它和資料庫中的相關記錄對應. Session 能夠在某些時間點, 按照緩衝中對象的變化來執行相關的 SQL 陳述式, 來同步更新資料庫, 這一過程被稱為重新整理緩衝(flush)

  3)站在持久化的角度, Hibernate 把對象分為 4 種狀態: 持久化狀態, 臨時狀態, 游離狀態, 刪除狀態. Session 的特定方法能使對象從一個狀態轉換到另一個狀態.

2.Session 緩衝

  1)在 Session 介面的實現中包含一系列的 Java 集合, 這些 Java 集合構成了 Session 緩衝. 只要 Session 執行個體沒有結束生命週期, 且沒有清理緩衝,則存放在它緩衝中的對象也不會結束生命週期

   2)Session 緩衝可減少 Hibernate 應用程式訪問資料庫的頻率。

    

 

 

 

   3) 關於session 緩衝的操作

    

 

 

  flush 緩衝

  ① flush:Session 按照緩衝中對象的屬性變化來同步更新資料庫

  ② 預設情況下 Session 在以下時間點重新整理緩衝:

       顯式調用 Session 的 flush() 方法

     當應用程式調用 Transaction 的 commit()方法的時, 該方法 先 flush ,然後在向資料庫提交事務

     當應用程式執行一些查詢(HQL, Criteria)操作時,如果緩衝中持久化對象的屬性已經發生了變化,會先 flush 緩衝,以保證查詢結果能夠反映持久化對象的最新狀態

   ③ flush 緩衝的例外情況: 如果對象使用 native 產生器產生 OID, 那麼當調用 Session 的 save() 方法儲存對象時, 會立即執行向資料庫插入該實體的 insert 語句.

      ④ commit() 和 flush() 方法的區別:flush 執行一系列 sql 語句,但不提交事務;commit 方法先調用flush() 方法,然後提交事務. 意味著提交事務意味著對資料庫操作永久儲存下來

   

    瞭解:設定重新整理緩衝的時間點:

     若希望改變 flush 的預設時間點, 可以通過 Session 的 setFlushMode() 方法顯式設定 flush 的時間點

    

 

reflesh(): 強制使緩衝中的某一個對象的狀態和資料庫的記錄一致。強制發送select語句,以使session緩衝中對象的狀態和資料表中對應的記錄一致

clear():清理緩衝

  

 

 4) 資料庫的隔離等級

    ① 資料庫的隔離等級:對於同時啟動並執行多個事務, 當這些事務訪問資料庫中相同的資料時, 如果沒有採取必要的隔離機制, 就會導致各種並發問題:

      > 髒讀: 對於兩個事物 T1, T2, T1 讀取了已經被 T2 更新但還沒有被提交的欄位. 之後, 若 T2 復原, T1讀取的內容就是臨時且無效的.

      > 不可重複讀取: 對於兩個事物 T1, T2, T1 讀取了一個欄位, 然後 T2 更新了該欄位. 之後, T1再次讀取同一個欄位, 值就不同了.

      >  幻讀: 對於兩個事物 T1, T2, T1 從一個表中讀取了一個欄位, 然後 T2 在該表中插入了一些新的行. 之後, 如果 T1 再次讀取同一個表, 就會多出幾行.

    ② 資料庫事務的隔離性: 資料庫系統必須具有隔離並發運行各個事務的能力, 使它們不會相互影響, 避免各種並發問題.

    ③ 一個事務與其他事務隔離的程度稱為隔離等級. 資料庫規定了多種交易隔離等級, 不同隔離等級對應不同的幹擾程度, 隔離等級越高, 資料一致性就越好, 但並發性越弱

    ④ 資料庫提供的 4 種交易隔離等級:

 

 

 

5)  在 MySql 中設定隔離等級

  ① 每啟動一個 mysql 程式, 就會獲得一個單獨的資料庫連接. 每個資料庫連接都有一個全域變數 @@tx_isolation, 表示當前的交易隔離等級. MySQL 預設的隔離等級為 Repeatable Read

  ② 查看當前的隔離等級: SELECT @@tx_isolation;

  ③ 設定當前 mySQL 串連的隔離等級:  set transaction isolation level read committed;

    ④ 設定資料庫系統的全域的隔離等級: set global transaction isolation level read committed;

 

6)在 Hibernate 中設定隔離等級

  ① JDBC 資料庫連接使用資料庫系統預設的隔離等級. 在 Hibernate 的設定檔中可以顯式的設定隔離等級. 每一個隔離等級都對應一個整數:

      1. READ UNCOMMITED

    2. READ COMMITED

      4. REPEATABLE READ

    8. SERIALIZEABLE

  ②Hibernate 通過為 Hibernate 對應檔指定 hibernate.connection.isolation 屬性來設定事務的隔離等級

 

[原創]java WEB學習筆記78:Hibernate學習之路---session概述,session緩衝(hibernate 一級緩衝),資料庫的隔離等級,在 MySql 中設定隔離等級,在 Hibernate 中設定隔離等級

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.