hibernate 二級快取和事務級別詳講
一、概述
這章總的分兩大塊來講解
第一大塊,hibernate的事務管理。對於hibernate的事務管理來說,如果之前學過資料庫的事務管理,那麼在這裡就順風順水了。如果沒學過,第一次遇到,那也沒關係,我會詳細解釋其中的內容。
第二大塊,hibernate的二級快取機制。這個看起來好高大上啊,如果從來沒了解過二級快取的人肯定覺得他很難,但是學過會發現,真的是so easy。最起碼會知道什麼是二級快取,作用是什麼。
二、hibernate的事務管理
2.1.1、什麼是事務?
事務是一組業務邏輯,比如A去銀行給B轉錢,A轉了100塊給B(update語句更新A的錢減少一百),B收到錢(update語句更新B的錢增加一百),這轉錢整個過程稱為事務,注意,不要覺得A轉錢給B,A做完了操作,就是事務了,要記住事務是一組業務邏輯,兩個在一起才是事務。在比如有一個數字5,現在有一個事務A,事務A做的事情就是將5變為4,該事務要做的事情有,拿到5,然後5-1,然後資料庫中的5變為了4,這才算這個事務A真正的成功了,可以那麼說,業務邏輯太抽象了,事務就是一組操作,只有整個操作在一起才算是一個事務。就向上面說的,轉錢也是一個事務,它做的操作就只有兩個,A減少錢,B增加錢。
2.1.2、事務的特性ACID
A(atomicity):原子性:事務不可被劃分,是一個整體,要麼一起成功,要麼一起失敗
C(consistence):一致性,A轉100給B,A減少了100,那麼B就要增加100,增加減少100就是一致的意思
I(isolation):隔離性,多個事務對同一內容的併發操作。
D(durability):永續性,已經提交的事務,就已經儲存到資料庫中,不能在改變了。
2.1.3、事務隔離性產生的問題
跟執行緒安全差不多,多個事務對同一內容同時進行操作,那麼就會出現一系列的併發問題。一定要注意,這個是兩個或者多個事務同時對一個內容進行操作,是同時,而不是先事務A操作完,然後事務B在操作,這個要理解清楚。
三、樂觀鎖,悲觀鎖 的理解
樂觀鎖
認為丟失更新一定不會發生,非常樂觀,在資料庫表中新增一個欄位,可以說是標識欄位把,用於記錄操作次數的,比如如果對有人拿到了該行記錄做了更新操作,該欄位就加1。然後下一個拿到該記錄的人要先將拿到的記錄的標識和資料庫中該記錄的標識做對比,如果一樣,則可以修改,並且修改後標識(版本)+1,如果不一樣,先從資料庫中查詢,然後在做更新。
舉個例子
A 查詢資料,username = 'jack' ,password = '1234',version=1
B 查詢資料,username="jack", password="1234',version=1 //AB同時拿到資料庫中資料,且version讀為1
A 更新密碼,使用者名稱不變 username='jack',password='456',version=2 //先和資料庫中該行記錄的version做對比,拿到 的version 是1,跟資料庫中一樣,所以能做更新,A將密碼更新,version+1,然後將其儲存到資料庫中(注意,這裡寫的是 A更新之後的的資料。 不要搞混了。)
B 更新使用者名稱,username='rose',password='1234',version=1 //B想要更新時,先和資料庫中該條記錄的版本號做對比,發現不一樣,然後查詢
B 重新查詢資料, 使用者名稱不變 username='jack',password='456',version=2 //然後在進行對比,這次version一樣了,B就可以實現更新操作了。
B 更新使用者名稱,username='rose',password='456',version=3 //更新後,version+1
悲觀鎖
認為丟失更新一定會發生,此時採用資料庫鎖機制,也就是相當於誰操作了該記錄行,就會在上面加把鎖,別人進不去,有等你操作完之後,該鎖就釋放,別人就可以操作了。跟那個隔離級別單事務差不多。但是鎖也分很多種。
讀鎖:共享鎖,大家可以一起讀資料,但是不能一起操作(更新,刪除,插入等)
寫鎖:排他鎖,只能一個進行寫,也就是上面我們說的原理。
四、hibernate的二級快取
概述
如果知道了資料庫中事務的知識,那麼在hibernate中就非常簡單,只是簡單的配置一下就OK了。所以在hibernate的事務講解這裡篇幅就比較少,重要的還是需要弄懂前面的知識。很重要。
4.1、什麼是二級快取
我們知道一級快取,並且一級快取的作用範圍就在session中,每個session都有一個自己的一級快取,而二級快取也就是比一級快取的作用範圍更廣,儲存的內容更多,我們知道session是由sesssionFactory創建出來的,一個sessionFactory能夠建立很多個session,每個session有自己的快取,稱為一級快取,而sessionFactory也有自己的快取,存放的內容供所有session共享,也就是二級快取。 是不是很簡單?還不理解看下面我畫的一張圖就一目瞭然了。
一級快取:儲存session中,事務範圍的快取(通俗點講,就是session關閉後,該快取就沒了,其快取只能在session的事務開啟和結束之間使用)
二級快取:儲存在SessionFactory,程序範圍內的快取(程序包括了多個執行緒,也就是我們上面說的意思,A執行緒可能拿到一個session進行操作,B執行緒也可能拿到一個session進行操作,但是A和B讀能訪問到SessionFactory中的快取,也就是二級快取,這裡只是拿A,B說事,可能有一個執行緒剛創建出來session,也能拿到二級快取中的資料)
好了,就說這麼多了