天天看點

第77節:Java中的事務和資料庫連接配接池和DBUtiles

第77節:Java中的事務和資料庫連接配接池和DBUtiles
第77節:Java中的事務和資料庫連接配接池和DBUtiles

看哭你,字數:8803,承蒙關照,謝謝朋友點贊!

第77節:Java中的事務和資料庫連接配接池和DBUtiles

<code>Transaction</code>事務,什麼是事務,事務是包含一組操作,這組操作裡面包含許多個單一的邏輯,隻要有一個邏輯沒有執行成功就算失敗,導緻復原就是指所有的資料都會回到最初的狀态.

有事務,是為了保證邏輯一定要成功,如銀行轉賬.

什麼是<code>jsp</code>,<code>jsp</code>的三大指令.

三大動作标簽:

九大内置對象:

取值

<code>EL</code>的11個隐式對象:

導包哦,引入标簽庫是1.1的:

第77節:Java中的事務和資料庫連接配接池和DBUtiles

資料庫指令行:

第77節:Java中的事務和資料庫連接配接池和DBUtiles
第77節:Java中的事務和資料庫連接配接池和DBUtiles

關閉自動送出.

關閉了送出,再減100:

第77節:Java中的事務和資料庫連接配接池和DBUtiles

會到資料庫檢視:

第77節:Java中的事務和資料庫連接配接池和DBUtiles

值沒改變!

第77節:Java中的事務和資料庫連接配接池和DBUtiles
第77節:Java中的事務和資料庫連接配接池和DBUtiles
第77節:Java中的事務和資料庫連接配接池和DBUtiles

添加改變代碼:

第77節:Java中的事務和資料庫連接配接池和DBUtiles
第77節:Java中的事務和資料庫連接配接池和DBUtiles

事務隻針對連接配接.

事務

記住:

什麼是事務,事務有什麼用處,事務怎麼用.

事務的特點:

原子性: 指的是事務中包含的邏輯,不可以分割(事務中邏輯不可分)

一緻性: 事務執行前和執行後,保持資料的完整性一緻(執行前後,資料保持一緻)

隔離性: 事務在執行期間不受到其他事務的影響(隔離不受影響)

持久性: 事務執行結束,送出或復原,資料都應該持久化到資料中(資料持久化在資料中)

安全問題

讀問題

髒讀,不可重複讀,幻讀

寫問題

丢失更新,解決丢失更新的方法,一悲觀鎖和樂觀鎖

隔離級别

第77節:Java中的事務和資料庫連接配接池和DBUtiles

髒讀:

第77節:Java中的事務和資料庫連接配接池和DBUtiles
第77節:Java中的事務和資料庫連接配接池和DBUtiles

一條連接配接:

第77節:Java中的事務和資料庫連接配接池和DBUtiles

另一條連接配接:

第77節:Java中的事務和資料庫連接配接池和DBUtiles

讀未送出

第77節:Java中的事務和資料庫連接配接池和DBUtiles
例子
第77節:Java中的事務和資料庫連接配接池和DBUtiles

這裡查詢,然後再看看資料庫中的表:

第77節:Java中的事務和資料庫連接配接池和DBUtiles

指令送出:

第77節:Java中的事務和資料庫連接配接池和DBUtiles
第77節:Java中的事務和資料庫連接配接池和DBUtiles
不可重複讀的問題
第77節:Java中的事務和資料庫連接配接池和DBUtiles
第77節:Java中的事務和資料庫連接配接池和DBUtiles
第77節:Java中的事務和資料庫連接配接池和DBUtiles
第77節:Java中的事務和資料庫連接配接池和DBUtiles
第77節:Java中的事務和資料庫連接配接池和DBUtiles
第77節:Java中的事務和資料庫連接配接池和DBUtiles
第77節:Java中的事務和資料庫連接配接池和DBUtiles
讀未送出,引發髒讀,讀已送出解決髒讀,引發不可重複讀, 可重複讀解決髒讀解決了髒讀,不可重複讀,

asss

讀:

髒讀 不可重讀讀 幻讀

一個事務讀到另外一個事務還未送出的資料

不可重複讀:

一個事務讀到另外一個事務送出的資料,導緻前後兩次查詢結果不一緻

幻讀:

一個事務讀到了另外一個事務已送出的插入的資料,導緻多次查詢結果不一緻.

讀未送出,

會導緻丢失更新

讀已送出,

能夠屏蔽 髒讀的現象,但是引發不可重複讀

隔離級别:

<code>mysql</code>預設的是重複讀.

設定A視窗的隔離級别為 讀未送出

第77節:Java中的事務和資料庫連接配接池和DBUtiles

兩個視窗都分别開啟事務

第77節:Java中的事務和資料庫連接配接池和DBUtiles
第77節:Java中的事務和資料庫連接配接池和DBUtiles

讀未送出是一個事務可以讀取到另一個事務還沒有送出的資料,會引發髒讀現象,讀取到的是資料庫記憶體中的資料,并不是真正的磁盤上的資料.

還未送出時,資料庫記憶體中的資料是不會改變的,隻有到commit送出後,資料庫中的資料才會送出,進而讀取真正在磁盤上的資料.

第77節:Java中的事務和資料庫連接配接池和DBUtiles
第77節:Java中的事務和資料庫連接配接池和DBUtiles

在a發生了變化,屏蔽了髒讀,引發不可重複讀,讀已送出.讀已送出,在a視窗設定的是讀已送出,兩邊開啟事務.在b視窗更新操作.

在a視窗查詢結果不一緻,一次是在b視窗送出事務之前,一次的送出之後.

第77節:Java中的事務和資料庫連接配接池和DBUtiles

引發了不可重複讀

不可重複讀,一個事務讀取到了另一個事務送出的資料,導緻前後兩次查詢結果不一緻.

會造成問題是前後讀取到的結果不一樣,發生了不可重複讀,就是不可以 重複讀取, 就是不能執行多次讀取, 否則會導緻結果不一緻, 這下好了, 讀取已送出導緻了 重複讀取, 結果還不一緻, 就出現了叫 不可重複讀 現象.

<code>Repeatable Read</code>重複讀, 重複讀就是mysql預設的隔離級别,可以讓食物在自己的會話中重複讀取資料,并且不會出現結果不一緻的現象, 就算其他事務送出了, 也還是會在視窗中出現以前的資料, 這就是可重複讀了.

重複讀, 就是讓它可以重複查詢, 結果還是和以前一樣的效果出現.

第77節:Java中的事務和資料庫連接配接池和DBUtiles
第77節:Java中的事務和資料庫連接配接池和DBUtiles

幻讀:什麼是幻讀呢?

就是一個事務讀到另一個事務已送出的插入的資料,會導緻多次查詢結果不一緻.就是幻讀,是不是幻讀了解為我幻想了, 事務已送出的插入資料, 導緻幻想了,(幻讀) 導緻每次查詢結果不一樣.

事務已送出,多次查詢結果不一緻.

幻讀-&gt;<code>Serializable</code>可串行化

該事務的級别是最高的事務級别,我是可串行化,是最高的.可以解決如下小弟的問題,如髒讀,不可重複讀,幻讀,因為我是可串行化,是大佬,但作為大佬,還是會有缺點的.

第77節:Java中的事務和資料庫連接配接池和DBUtiles
第77節:Java中的事務和資料庫連接配接池和DBUtiles
第77節:Java中的事務和資料庫連接配接池和DBUtiles

是的,a送出才動.現在我們讓b先開啟事務.

第77節:Java中的事務和資料庫連接配接池和DBUtiles
第77節:Java中的事務和資料庫連接配接池和DBUtiles
第77節:Java中的事務和資料庫連接配接池和DBUtiles

可串行化, 誰先打開事務,就誰有權利,這個隔離級别,先打開就有權利讓别人等着,等先打開事務的那個家夥,送出或者復原後,才能進行,這種級别是用得比較少的,因為容易導緻性能上效率低下.

隔離級别有四個哦

讀已送出

可重複讀

可串行化

如果按照效率劃分,從高到低,排個名次如下:

讀未送出 -&gt; 髒讀

讀已送出 -&gt; 不可重複讀

可重複讀 -&gt; 解決重複讀

可串行化 -&gt; 以上都是我小弟來着

按照攔截程度來劃分,從高到底,排名如下:

可串行化 -&gt; 我是大哥

可重複讀 -&gt; 我是二哥

讀已送出 -&gt; 我是三弟

讀未送出 -&gt; 我是小弟

事務隻是針對連接配接對象.事務是會自動送出的.

安全隐患和隔離級别

安全隐患: 讀的安全隐患和寫的安全隐患

髒讀,讀到未送出的資料,一個事務讀到了另一個事務未送出的資料;

不可重複讀,就是一個事務讀到了另一個事務已經送出的資料,導緻前後兩次查詢的結果不一緻;

幻讀,就是一個事務讀到了另一個事務添加的資料,導緻前後查詢結果不一緻.

寫: 丢失更新…

讀未送出,導緻髒讀

讀已送出,解決髒讀,導緻不可重複讀

可重複讀,解決髒讀和不可重複讀,導緻幻讀

可串行化,解決髒讀,不可重複讀,幻讀

預設的mysql是可重複讀,oracle預設是讀已送出

丢失更新

樂觀鎖

悲觀鎖

安全問題包含 讀的問題和寫的問題

事務的特性是什麼? 原子性,一緻性,隔離性,持久性
第77節:Java中的事務和資料庫連接配接池和DBUtiles
第77節:Java中的事務和資料庫連接配接池和DBUtiles

b視窗沒有送出.等待送出中:

案例控制台,我的a:

第77節:Java中的事務和資料庫連接配接池和DBUtiles

哭了,這是設定預設的重複讀啊!

聽說丢失更新

a事務和b事務同時查詢一個表,a開始修改并送出<code>name</code>字段的名字,然後b事務開始修改該行的<code>money</code>的字段,如果b事務送出,那麼之前a事務修改的名字沒有了,變回去了哦,當然b事務復原,也同樣導緻a事務更新沒有了哦.復原也會把之前b事務的最初的資料還原.

這裡的情況處理序列化級别外,就是可串行化級别大佬哦!

解決丢失更新的方法

悲觀鎖的态度,它是悲觀的态度,它是一定會丢失更新,它的想法是我一定會出錯.

而樂觀鎖,它的态度是我一定不會丢失更新.

資料庫的鎖機制,排他鎖

第77節:Java中的事務和資料庫連接配接池和DBUtiles
第77節:Java中的事務和資料庫連接配接池和DBUtiles
丢失更新的問題

不考慮隔離性,産生寫入資料導緻的問題為丢失更新的問題,兩個事務同時對某一條記錄做修改,然後會導緻丢失更新的問題.

a,b兩個事務同時擷取一條資料,同時做了修改,a事務修改後,送出了事務,b事務修改後,不管是送出還是復原,都會對資料發生影響.

悲觀鎖記住用了這句:

a事務先送出,資料庫版本<code>version</code>變為1,b事務在送出的時候,比對資料庫<code>version</code>和自己的<code>version</code>是不一樣的,不允許送出,要先更新.

a送出的時候版本變為1,b送出的時候,發現版本不一緻就無法送出,要進行更新後送出.

什麼是連接配接池,連接配接池的作用是什麼,自定義連接配接池,開源的連接配接池?

那麼什麼是資料庫連接配接池?

資料庫連接配接池是Java程式和資料連接配接的中介媒介,以前一個Java程式對應一個連接配接,然後就可以連接配接到資料了,可以一旦多了呢?

就有人發明了資料庫連接配接池,可以一下連接配接多個,但是是有限制的,一旦多了,就會擴容,額外增加3到5個,不會增幅太大,也有最大值的限制.

資料庫的連接配接對象 建立工作 比較消耗性能 一開始在記憶體中會開辟一塊空間, 用于是 這個資料庫連接配接池的空間, 可以在池子裡放置很多個連接配接對象, 資料庫連接配接池裡有很多個連接配接對象, 後面需要連接配接的話會直接從池子裡面去, 就不用自己去建立連接配接了, 因為資料庫的連接配接對象建立工作是比較耗時的, 使用完, 資料庫連接配接池中的 連接配接對象 ,是要進行歸還的, 確定連接配接對象可以循環連接配接使用.
建立資料庫的連接配接池
第77節:Java中的事務和資料庫連接配接池和DBUtiles
自定義資料庫連接配接池

解決自定義資料庫連接配接池問題

因為多了一個<code>addBack</code>方法,要記住這個方法,且不能用面向接口程式設計.修改<code>close</code>方法,改成不是關閉而是歸還連接配接對象.

如何擴充方法

裝飾者模式

裝飾者模式:

分析
第77節:Java中的事務和資料庫連接配接池和DBUtiles
第77節:Java中的事務和資料庫連接配接池和DBUtiles
第77節:Java中的事務和資料庫連接配接池和DBUtiles
第77節:Java中的事務和資料庫連接配接池和DBUtiles
第77節:Java中的事務和資料庫連接配接池和DBUtiles
資料庫連接配接池_DBCP

DBCP開源連接配接池

C3P0,什麼是C3P0,怎麼用

DBCP為資料庫連接配接池,是java資料庫連接配接池的一種是Apache開發的,通過資料庫連接配接池可以讓程式自動管理資料庫的連接配接.

C3P0也是一種開源的連接配接池,實作了資料庫和JNDI綁定,使用它的開源項目:

怎麼用DBCP

導入jar包

DBCP連接配接資料庫使用

以上是不使用配置檔案的情況.

DBCP使用配置檔案方式
第77節:Java中的事務和資料庫連接配接池和DBUtiles
第77節:Java中的事務和資料庫連接配接池和DBUtiles
不使用配置方式
第77節:Java中的事務和資料庫連接配接池和DBUtiles
C3P0使用配置檔案的方式
第77節:Java中的事務和資料庫連接配接池和DBUtiles
第77節:Java中的事務和資料庫連接配接池和DBUtiles
第77節:Java中的事務和資料庫連接配接池和DBUtiles

<code>c3p0-config.xml file</code>:

第77節:Java中的事務和資料庫連接配接池和DBUtiles

可以弄oracle:

<code>oracle</code>:

什麼是DBUtils呢?怎麼用呢?

優化資料庫連接配接,使用C3P0:

DBUtils優化增删改查方法

導包,兩行代碼交你增删改查,6666!

兩行.

第77節:Java中的事務和資料庫連接配接池和DBUtiles
第77節:Java中的事務和資料庫連接配接池和DBUtiles
查詢
第77節:Java中的事務和資料庫連接配接池和DBUtiles
查詢優化
第77節:Java中的事務和資料庫連接配接池和DBUtiles

一個對象: BeanHandler

一個集合裡面有很多對象: BeanListHandler

優化成兩行代碼:

第77節:Java中的事務和資料庫連接配接池和DBUtiles
查詢多個資料
第77節:Java中的事務和資料庫連接配接池和DBUtiles
第77節:Java中的事務和資料庫連接配接池和DBUtiles

實作類:

第77節:Java中的事務和資料庫連接配接池和DBUtiles
事務,連接配接池,DBUtils

查詢:

第77節:Java中的事務和資料庫連接配接池和DBUtiles

髒讀

不可重複讀

幻讀

丢失更新 寫的問題

悲觀鎖 for update

樂觀鎖 ,添加字段版本級别

4個隔離級别

讀未送出,引發髒讀

讀已送出,引發不可重複讀,解決了髒讀

可重複讀,引發了幻讀,解決了髒讀,不可重複讀

可串行化(序列化),解決了髒讀,不可重複讀,幻讀,引發效率低下問題

資料庫連接配接池

BCP -&gt; 不使用配置 使用配置

C3P0 -&gt; 不使用配置 使用配置

自定義連接配接池 -&gt; 飾者模式

可在評論發表你的總結内容,做功課哦!

如果看了覺得不錯

點贊!轉發!

達叔小生:往後餘生,唯獨有你 You and me, we are family ! 90後帥氣小夥,良好的開發習慣;獨立思考的能力;主動并且善于溝通 簡書部落格: 達叔小生 https://www.jianshu.com/u/c785ece603d1

下面我将繼續對 其他知識 深入講解 ,有興趣可以繼續關注

小禮物走一走 or 點贊

版權聲明: 本部落格所有文章除特别聲明外,均采用 CC BY-NC-SA 3.0 許可協定。轉載請注明出處!