
第77節:Java中的事務和資料庫連接配接池和DBUtiles
看哭你,字數:8803,承蒙關照,謝謝朋友點贊!
<code>Transaction</code>事務,什麼是事務,事務是包含一組操作,這組操作裡面包含許多個單一的邏輯,隻要有一個邏輯沒有執行成功就算失敗,導緻復原就是指所有的資料都會回到最初的狀态.
有事務,是為了保證邏輯一定要成功,如銀行轉賬.
什麼是<code>jsp</code>,<code>jsp</code>的三大指令.
三大動作标簽:
九大内置對象:
取值
<code>EL</code>的11個隐式對象:
導包哦,引入标簽庫是1.1的:
資料庫指令行:
關閉自動送出.
關閉了送出,再減100:
會到資料庫檢視:
值沒改變!
添加改變代碼:
事務隻針對連接配接.
事務
記住:
什麼是事務,事務有什麼用處,事務怎麼用.
事務的特點:
原子性: 指的是事務中包含的邏輯,不可以分割(事務中邏輯不可分)
一緻性: 事務執行前和執行後,保持資料的完整性一緻(執行前後,資料保持一緻)
隔離性: 事務在執行期間不受到其他事務的影響(隔離不受影響)
持久性: 事務執行結束,送出或復原,資料都應該持久化到資料中(資料持久化在資料中)
安全問題
讀問題
髒讀,不可重複讀,幻讀
寫問題
丢失更新,解決丢失更新的方法,一悲觀鎖和樂觀鎖
隔離級别
髒讀:
一條連接配接:
另一條連接配接:
讀未送出
例子
這裡查詢,然後再看看資料庫中的表:
指令送出:
不可重複讀的問題
讀未送出,引發髒讀,讀已送出解決髒讀,引發不可重複讀, 可重複讀解決髒讀解決了髒讀,不可重複讀,
asss
讀:
髒讀 不可重讀讀 幻讀
一個事務讀到另外一個事務還未送出的資料
不可重複讀:
一個事務讀到另外一個事務送出的資料,導緻前後兩次查詢結果不一緻
幻讀:
一個事務讀到了另外一個事務已送出的插入的資料,導緻多次查詢結果不一緻.
讀未送出,
會導緻丢失更新
讀已送出,
能夠屏蔽 髒讀的現象,但是引發不可重複讀
隔離級别:
<code>mysql</code>預設的是重複讀.
設定A視窗的隔離級别為 讀未送出
兩個視窗都分别開啟事務
讀未送出是一個事務可以讀取到另一個事務還沒有送出的資料,會引發髒讀現象,讀取到的是資料庫記憶體中的資料,并不是真正的磁盤上的資料.
還未送出時,資料庫記憶體中的資料是不會改變的,隻有到commit送出後,資料庫中的資料才會送出,進而讀取真正在磁盤上的資料.
在a發生了變化,屏蔽了髒讀,引發不可重複讀,讀已送出.讀已送出,在a視窗設定的是讀已送出,兩邊開啟事務.在b視窗更新操作.
在a視窗查詢結果不一緻,一次是在b視窗送出事務之前,一次的送出之後.
引發了不可重複讀
不可重複讀,一個事務讀取到了另一個事務送出的資料,導緻前後兩次查詢結果不一緻.
會造成問題是前後讀取到的結果不一樣,發生了不可重複讀,就是不可以 重複讀取, 就是不能執行多次讀取, 否則會導緻結果不一緻, 這下好了, 讀取已送出導緻了 重複讀取, 結果還不一緻, 就出現了叫 不可重複讀 現象.
<code>Repeatable Read</code>重複讀, 重複讀就是mysql預設的隔離級别,可以讓食物在自己的會話中重複讀取資料,并且不會出現結果不一緻的現象, 就算其他事務送出了, 也還是會在視窗中出現以前的資料, 這就是可重複讀了.
重複讀, 就是讓它可以重複查詢, 結果還是和以前一樣的效果出現.
幻讀:什麼是幻讀呢?
就是一個事務讀到另一個事務已送出的插入的資料,會導緻多次查詢結果不一緻.就是幻讀,是不是幻讀了解為我幻想了, 事務已送出的插入資料, 導緻幻想了,(幻讀) 導緻每次查詢結果不一樣.
事務已送出,多次查詢結果不一緻.
幻讀-><code>Serializable</code>可串行化
該事務的級别是最高的事務級别,我是可串行化,是最高的.可以解決如下小弟的問題,如髒讀,不可重複讀,幻讀,因為我是可串行化,是大佬,但作為大佬,還是會有缺點的.
是的,a送出才動.現在我們讓b先開啟事務.
可串行化, 誰先打開事務,就誰有權利,這個隔離級别,先打開就有權利讓别人等着,等先打開事務的那個家夥,送出或者復原後,才能進行,這種級别是用得比較少的,因為容易導緻性能上效率低下.
隔離級别有四個哦
讀已送出
可重複讀
可串行化
如果按照效率劃分,從高到低,排個名次如下:
讀未送出 -> 髒讀
讀已送出 -> 不可重複讀
可重複讀 -> 解決重複讀
可串行化 -> 以上都是我小弟來着
按照攔截程度來劃分,從高到底,排名如下:
可串行化 -> 我是大哥
可重複讀 -> 我是二哥
讀已送出 -> 我是三弟
讀未送出 -> 我是小弟
事務隻是針對連接配接對象.事務是會自動送出的.
安全隐患和隔離級别
安全隐患: 讀的安全隐患和寫的安全隐患
髒讀,讀到未送出的資料,一個事務讀到了另一個事務未送出的資料;
不可重複讀,就是一個事務讀到了另一個事務已經送出的資料,導緻前後兩次查詢的結果不一緻;
幻讀,就是一個事務讀到了另一個事務添加的資料,導緻前後查詢結果不一緻.
寫: 丢失更新…
讀未送出,導緻髒讀
讀已送出,解決髒讀,導緻不可重複讀
可重複讀,解決髒讀和不可重複讀,導緻幻讀
可串行化,解決髒讀,不可重複讀,幻讀
預設的mysql是可重複讀,oracle預設是讀已送出
丢失更新
樂觀鎖
悲觀鎖
安全問題包含 讀的問題和寫的問題
事務的特性是什麼? 原子性,一緻性,隔離性,持久性
b視窗沒有送出.等待送出中:
案例控制台,我的a:
哭了,這是設定預設的重複讀啊!
聽說丢失更新
a事務和b事務同時查詢一個表,a開始修改并送出<code>name</code>字段的名字,然後b事務開始修改該行的<code>money</code>的字段,如果b事務送出,那麼之前a事務修改的名字沒有了,變回去了哦,當然b事務復原,也同樣導緻a事務更新沒有了哦.復原也會把之前b事務的最初的資料還原.
這裡的情況處理序列化級别外,就是可串行化級别大佬哦!
解決丢失更新的方法
悲觀鎖的态度,它是悲觀的态度,它是一定會丢失更新,它的想法是我一定會出錯.
而樂觀鎖,它的态度是我一定不會丢失更新.
資料庫的鎖機制,排他鎖
丢失更新的問題
不考慮隔離性,産生寫入資料導緻的問題為丢失更新的問題,兩個事務同時對某一條記錄做修改,然後會導緻丢失更新的問題.
a,b兩個事務同時擷取一條資料,同時做了修改,a事務修改後,送出了事務,b事務修改後,不管是送出還是復原,都會對資料發生影響.
悲觀鎖記住用了這句:
a事務先送出,資料庫版本<code>version</code>變為1,b事務在送出的時候,比對資料庫<code>version</code>和自己的<code>version</code>是不一樣的,不允許送出,要先更新.
a送出的時候版本變為1,b送出的時候,發現版本不一緻就無法送出,要進行更新後送出.
什麼是連接配接池,連接配接池的作用是什麼,自定義連接配接池,開源的連接配接池?
那麼什麼是資料庫連接配接池?
資料庫連接配接池是Java程式和資料連接配接的中介媒介,以前一個Java程式對應一個連接配接,然後就可以連接配接到資料了,可以一旦多了呢?
就有人發明了資料庫連接配接池,可以一下連接配接多個,但是是有限制的,一旦多了,就會擴容,額外增加3到5個,不會增幅太大,也有最大值的限制.
資料庫的連接配接對象 建立工作 比較消耗性能 一開始在記憶體中會開辟一塊空間, 用于是 這個資料庫連接配接池的空間, 可以在池子裡放置很多個連接配接對象, 資料庫連接配接池裡有很多個連接配接對象, 後面需要連接配接的話會直接從池子裡面去, 就不用自己去建立連接配接了, 因為資料庫的連接配接對象建立工作是比較耗時的, 使用完, 資料庫連接配接池中的 連接配接對象 ,是要進行歸還的, 確定連接配接對象可以循環連接配接使用.
建立資料庫的連接配接池
自定義資料庫連接配接池
解決自定義資料庫連接配接池問題
因為多了一個<code>addBack</code>方法,要記住這個方法,且不能用面向接口程式設計.修改<code>close</code>方法,改成不是關閉而是歸還連接配接對象.
如何擴充方法
裝飾者模式
裝飾者模式:
分析
資料庫連接配接池_DBCP
DBCP開源連接配接池
C3P0,什麼是C3P0,怎麼用
DBCP為資料庫連接配接池,是java資料庫連接配接池的一種是Apache開發的,通過資料庫連接配接池可以讓程式自動管理資料庫的連接配接.
C3P0也是一種開源的連接配接池,實作了資料庫和JNDI綁定,使用它的開源項目:
怎麼用DBCP
導入jar包
DBCP連接配接資料庫使用
以上是不使用配置檔案的情況.
DBCP使用配置檔案方式
不使用配置方式
C3P0使用配置檔案的方式
<code>c3p0-config.xml file</code>:
可以弄oracle:
<code>oracle</code>:
什麼是DBUtils呢?怎麼用呢?
優化資料庫連接配接,使用C3P0:
DBUtils優化增删改查方法
導包,兩行代碼交你增删改查,6666!
兩行.
查詢
查詢優化
一個對象: BeanHandler
一個集合裡面有很多對象: BeanListHandler
優化成兩行代碼:
查詢多個資料
實作類:
事務,連接配接池,DBUtils
查詢:
髒讀
不可重複讀
幻讀
丢失更新 寫的問題
悲觀鎖 for update
樂觀鎖 ,添加字段版本級别
4個隔離級别
讀未送出,引發髒讀
讀已送出,引發不可重複讀,解決了髒讀
可重複讀,引發了幻讀,解決了髒讀,不可重複讀
可串行化(序列化),解決了髒讀,不可重複讀,幻讀,引發效率低下問題
資料庫連接配接池
BCP -> 不使用配置 使用配置
C3P0 -> 不使用配置 使用配置
自定義連接配接池 -> 飾者模式
可在評論發表你的總結内容,做功課哦!
如果看了覺得不錯
點贊!轉發!
達叔小生:往後餘生,唯獨有你 You and me, we are family ! 90後帥氣小夥,良好的開發習慣;獨立思考的能力;主動并且善于溝通 簡書部落格: 達叔小生 https://www.jianshu.com/u/c785ece603d1
下面我将繼續對 其他知識 深入講解 ,有興趣可以繼續關注
小禮物走一走 or 點贊
版權聲明: 本部落格所有文章除特别聲明外,均采用 CC BY-NC-SA 3.0 許可協定。轉載請注明出處!