【JDBC】事務(wù)

事務(wù)

基本概念

事務(wù)使指一組最小邏輯操作單元开镣,里面有多個操作組成
組成事務(wù)的每一部分必須要同時提交成功
如果有一個操作失敗咽扇,整個操作回滾

事務(wù)的 ACID特性

  • 原子性Atomicity)
    原子性是指事務(wù)是一個不可分割的工作單位糠馆,
    事務(wù)中的操作要么都發(fā)生耽装,要么都不發(fā)生
  • 一致性Consistency)
    事務(wù)必須使數(shù)據(jù)庫從一個一致性狀態(tài)變換到另外一個一致性狀態(tài)
  • 隔離性Isolation)
    事務(wù)的隔離性是多個用戶并發(fā)訪問數(shù)據(jù)庫時,
    數(shù)據(jù)庫為每一個用戶開啟的事務(wù),
    不能其他事務(wù)的操作數(shù)據(jù)干擾谍婉,
    多個并發(fā)事務(wù)之間相互隔離
  • 持久性Durability)
    持久性是指一個事務(wù)一旦被提交
    對數(shù)據(jù)庫中數(shù)據(jù)的改變就是永久性的镀钓,
    接下來即使數(shù)據(jù)庫發(fā)生故障不應該對其有任何影響

默認情況下穗熬,Connection 對象處于自動提交模式下,
這意味著它在執(zhí)行每個語句后都會自動提交更改
如果禁用了自動提交模式丁溅,那么要提交更改就必須顯式調(diào)用 commit 方法唤蔗;否則無法保存數(shù)據(jù)庫更改

void setAutoCommit(boolean autoCommit) throws SQLException

將此連接的自動提交模式設(shè)置為給定狀態(tài)
如果連接處于自動提交模式下窟赏,則它的所有 SQL 語句被執(zhí)行作為單個事務(wù)提交
否則妓柜,它的 SQL 語句將聚集到事務(wù)中
直到調(diào)用 commit 方法rollback 方法為止饰序。
默認情況下领虹,新連接處于自動提交模式

那么,本人現(xiàn)在來展示下事務(wù)的使用:
例子:

這天求豫,一個粉絲想要資助右轉(zhuǎn)哥(做夢ing)塌衰,粉絲和右轉(zhuǎn)哥的銀行賬戶金額分別為2333和10999诉稍,而粉絲要給右轉(zhuǎn)哥轉(zhuǎn)賬4333,以便給右轉(zhuǎn)哥湊個6666出來


轉(zhuǎn)帳前 展示

那么最疆,請看如下代碼:

package edu.youzg.about_jdbc.core;

import edu.youzg.about_jdbc.utils.JDBCUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class FundDemo {

    public static void main(String[] args) throws Exception {
        //轉(zhuǎn)賬
        //默認事務(wù)是自動開啟的
        Connection conn1 = JDBCUtils.getConnection();
        //編寫sql語句
        String sql1="update bank set money=money-4333 where username='fan'";
        String sql2 = "update bank set money=money+4333 where username='youzg'";
        //獲取操作對象
        PreparedStatement statement1 = conn1.prepareStatement(sql1);
        PreparedStatement statement2 = conn1.prepareStatement(sql2);
        //執(zhí)行:
        statement1.executeUpdate(); //單獨事務(wù)1 自動提交

        //模擬一個異常
        System.out.println(1/0);
        statement2.executeUpdate();//單獨的事務(wù)2 自動提交
        //釋放資源
        conn1.close();
        statement1.close();
        statement2.close();
    }

}

那么杯巨,本人來展示下運行后的結(jié)果:


轉(zhuǎn)賬過程中發(fā)生異常 展示

轉(zhuǎn)賬發(fā)生異常1 展示

可以看到:當轉(zhuǎn)賬過程中出現(xiàn)了異常之后,發(fā)生異常的那句代碼之后的代碼段都不會執(zhí)行
所以導致了努酸,粉絲已經(jīng)轉(zhuǎn)賬過了服爷,但是右轉(zhuǎn)哥這里卻沒有收到轉(zhuǎn)賬

這跟本人之前講解的異常的知識點有關(guān):
異常相當于return

那么,上面的結(jié)果顯然是不合理的获诈,
轉(zhuǎn)賬不能因為一個異常導致轉(zhuǎn)的金額就憑空消失了

所以仍源,這里就運用到了事務(wù)性質(zhì)
那么,本人現(xiàn)在來展示下使用事務(wù)的性質(zhì)來解決上述問題的代碼:

package edu.youzg.about_jdbc.core;

import edu.youzg.about_jdbc.utils.JDBCUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class FundDemo {

    public static void main(String[] args) throws Exception {
        Connection conn1=null;
        try {
            //轉(zhuǎn)賬
            //默認事務(wù)是自動開啟的
            conn1 = JDBCUtils.getConnection();
            //設(shè)置數(shù)據(jù)庫的隔離級別舔涎,一般不要設(shè)置笼踩。數(shù)據(jù)庫裝好之后的默認級別就OK
            //1.把事務(wù)改成手動提交。
            conn1.setAutoCommit(false);
            //編寫sql語句
            String sql1 = "update bank set money=money-4333 where username='fan'";
            String sql2 = "update bank set money=money+4333 where username='youzg'";
            //獲取操作對象
            PreparedStatement statement1 = conn1.prepareStatement(sql1);
            PreparedStatement statement2 = conn1.prepareStatement(sql2);
            //執(zhí)行:
            statement1.executeUpdate();
            //模擬異常
            System.out.println(1 / 0);
            statement2.executeUpdate();

        } catch (Exception e) {
            try {
                //一旦遇到異常亡嫌,咱們就回滾事務(wù)
                conn1.rollback();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            e.printStackTrace();
        }finally {
            //不管有沒有遇到異常,我們都提交事務(wù)
            try {
                conn1.commit();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        System.out.println("操作完成");
    }

}

那么嚎于,我們再來運行下代碼,來看看運行后的結(jié)果:


轉(zhuǎn)賬發(fā)生異常2 展示

轉(zhuǎn)賬發(fā)生異常2 展示

那么挟冠,可以看到:
即使發(fā)生了異常于购,也不會導致總金額減少,保證了數(shù)據(jù)的一致性


那么知染,現(xiàn)在肋僧,本人來講解下 事務(wù)的隔離級別

事務(wù)的隔離級別:

若是我們不考慮事務(wù)的隔離性,就會產(chǎn)生如下三種讀問題:

  • 臟讀:
    一個事務(wù)中讀取到另一個事務(wù) 沒有提交的數(shù)據(jù)
  • 不可重復讀:
    一個事務(wù)中持舆,兩次查詢的結(jié)果不一致(針對的update操作)
    即 在數(shù)據(jù)庫訪問中色瘩,一個事務(wù)范圍內(nèi)兩個相同的查詢返回了不同數(shù)據(jù)
  • 虛讀(幻讀):
    一個事務(wù)中,兩次查詢的結(jié)果不一致(針對的insert操作) 無法演示出來
    (MySQL已經(jīng)默認避免了)

那么逸寓,現(xiàn)在居兆,本人來講解下事務(wù)的隔離級別
隔離級別

  • read uncommitted:
    讀未提交
    上面的三個問題都會出現(xiàn)
  • read committed:
    讀已提交
    可以避免臟讀的發(fā)生
    (Oracle 默認級別)
  • repeatable read:
    可重復讀
    可以避免臟讀和不可重復讀的發(fā)生
    (MySQL 默認級別)
  • serializable:
    串行化
    可以避免所有的問題

相關(guān)語句和方法

  1. sql語句
  • set session transaction isolation level 隔離級別:
    將 隔離級別 設(shè)置為 指定級別
  • select @@tx_isolation:
    查看數(shù)據(jù)庫的隔離級別
  1. Java方法
  • void setTransactionIsolation(int level):
    控制隔離級別

那么,本篇博文的知識點在這里就講解完畢了竹伸。
(請觀看本人博文 —— 《JDBC 專欄總集篇》)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末泥栖,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子勋篓,更是在濱河造成了極大的恐慌到忽,老刑警劉巖艰躺,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辉饱,死亡現(xiàn)場離奇詭異犀忱,居然都是意外死亡,警方通過查閱死者的電腦和手機拜银,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門殊鞭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來遭垛,“玉大人,你說我怎么就攤上這事操灿【庖牵” “怎么了趾盐?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵庶喜,是天一觀的道長。 經(jīng)常有香客問我救鲤,道長久窟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任蜒简,我火速辦了婚禮瘸羡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘搓茬。我一直安慰自己,他們只是感情好队他,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布卷仑。 她就那樣靜靜地躺著,像睡著了一般麸折。 火紅的嫁衣襯著肌膚如雪锡凝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天垢啼,我揣著相機與錄音窜锯,去河邊找鬼。 笑死芭析,一個胖子當著我的面吹牛锚扎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播馁启,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼驾孔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了惯疙?” 一聲冷哼從身側(cè)響起翠勉,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎霉颠,沒想到半個月后对碌,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡蒿偎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年朽们,在試婚紗的時候發(fā)現(xiàn)自己被綠了怀读。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡华坦,死狀恐怖愿吹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情惜姐,我是刑警寧澤犁跪,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站歹袁,受9級特大地震影響坷衍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜条舔,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一枫耳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧孟抗,春花似錦迁杨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至摊沉,卻和暖如春狐史,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背说墨。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工骏全, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人尼斧。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓姜贡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親突颊。 傳聞我的和親對象是個殘疾皇子鲁豪,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 一、什么是事務(wù) 邏輯上的一組操作, 律秃,要不全部失敗爬橡,要不全部成功。 MySql的事務(wù)管理 在事務(wù)管理中執(zhí)行sql棒动,...
    明天你好向前奔跑閱讀 806評論 0 4
  • 1糙申、事務(wù) 事務(wù)是訪問數(shù)據(jù)庫的一個操作序列,數(shù)據(jù)庫應用系統(tǒng)通過事務(wù)集來完成對數(shù)據(jù)庫的存取船惨。事務(wù)的正確執(zhí)行使得數(shù)據(jù)庫從...
    癡情浪少閱讀 206評論 0 0
  • 1柜裸、通過JDBC連接數(shù)據(jù)庫有哪幾種方式? 1)通過Driver接口直接連接數(shù)據(jù)庫 2)編寫一個通用的方法(通過Dr...
    夏與清風閱讀 316評論 0 1
  • 姓名:張艷秋 公司:海南蔚藍時代實業(yè)有限公司 組別:第 420 期 樂觀一組 (參加培訓時的組名) 【日精進打卡第...
    我又不是奧利奧泡什么泡閱讀 67評論 0 0
  • 換個角度拍的小花缕陕,美不可言 下午一點接上海浦東機場飛到濟南遙墻機場的客人 接到兩位客人一個50多歲和一個40多歲的...
    常靈有道閱讀 352評論 0 0