JDBC事務

1、事務

事務是訪問數(shù)據(jù)庫的一個操作序列及刻,數(shù)據(jù)庫應用系統(tǒng)通過事務集來完成對數(shù)據(jù)庫的存取镀裤。事務的正確執(zhí)行使得數(shù)據(jù)庫從一種狀態(tài)轉(zhuǎn)換成另一種狀態(tài)。

當操作序列中的所有操作都成功執(zhí)行時提茁,事務的狀態(tài)未成功淹禾。當任一操作失敗時,事務的狀態(tài)為失敗茴扁,此時必須將程序狀態(tài)返回至事務未執(zhí)行時的狀態(tài)铃岔,即回滾。

1.2 四個特性

原子性(Atomicity):事務中的所有操作是不可再分割的原子單位峭火,事務中的所有操作是一個整體毁习,或者整體執(zhí)行成功,亦或者整體執(zhí)行失敗卖丸。

一致性(Consistency):事務執(zhí)行后纺且,數(shù)據(jù)庫狀態(tài)與其他業(yè)務規(guī)則保持一致。如轉(zhuǎn)賬業(yè)務稍浆,無論執(zhí)行成功與否载碌,參與轉(zhuǎn)賬的兩個帳號余額值和應該是不變的。

隔離性(Isolation):在并發(fā)操作中衅枫,不同事務之間應該隔離開來嫁艇,每個并發(fā)中的事務的執(zhí)行不會相互干擾。

持久性(Durability):一旦事務提交成功弦撩,事務中的所有數(shù)據(jù)更新必須被持久化到數(shù)據(jù)庫中步咪,即使提交事務后,數(shù)據(jù)庫馬上崩潰益楼,在數(shù)據(jù)庫重新啟動時猾漫,也必須能保證通過某種機制恢復數(shù)據(jù)点晴。

1.3 數(shù)據(jù)庫的兩種事務模式

(1)自動提交模式:每個SQL語句都是一個獨立的事務,當數(shù)據(jù)庫系統(tǒng)執(zhí)行完一個SQL語句后悯周,會自動提交事務粒督。

(2)手動提交模式:必須由數(shù)據(jù)庫客戶程序顯示指定事務開始邊界和結(jié)束邊界。

默認是自動提交模式

1.4 數(shù)據(jù)庫讀寫中的并發(fā)事務問題

(1)臟讀(Dirty Read):在事務的執(zhí)行過程中禽翼,讀取到了其他事務的 未提交 的數(shù)據(jù)坠陈,即讀到了臟數(shù)據(jù)。

(2)不可重復讀(Unrepeatable Read):在事務的執(zhí)行過程中捐康,讀到了其他事務 修改后 的數(shù)據(jù)仇矾,換句話說在該事務中的不同時間點讀取到了不一致的數(shù)據(jù),即不可重復讀解总。

(3)幻讀/虛讀(Phantom Read):在事務的執(zhí)行過程中贮匕,讀取到了其他事務對 記錄數(shù) 修改后的數(shù)據(jù),對同一張表的兩次查詢的 COUNT(*) 不一致花枫。

不可重復讀與幻讀的區(qū)別:

不可重復讀:強調(diào)的是數(shù)據(jù) 內(nèi)容 的不一致刻盐,主要針對 UPDATE 的修改。

幻讀:強調(diào)的是 記錄數(shù) 的不一致劳翰,主要針對 INSERT/DELETE 的修改敦锌。

1.5 四個隔離級別

并發(fā)事務問題的產(chǎn)生原因是,未能遵守事務的隔離特性

(1)串行化(SERIALIZABLE):所有的事務依次逐個執(zhí)行佳簸,這樣事務之間就完全不可能產(chǎn)生干擾乙墙,也就是說,該級別可以防止臟讀生均、不可重復讀以及幻讀听想。但是這將嚴重影響程序的性能。通常情況下也不會用到該級別马胧。

(2)可重復讀(REPEATABLE_READ):該隔離級別表示一個事務在整個過程中可以多次重復執(zhí)行某個查詢汉买,并且每次返回的記錄都相同。即使在多次查詢之間有新增的數(shù)據(jù)滿足該查詢佩脊,這些新增的記錄也會被忽略蛙粘。該級別可以防止臟讀和不可重復讀。

(3)讀已提交(READ_COMMITTED):該隔離級別表示一個事務只能讀取另一個事務已經(jīng)提交的數(shù)據(jù)威彰。該級別可以防止臟讀出牧,這也是大多數(shù)情況下的推薦值。

(4)讀未提交(READ_UNCOMMITTED):該隔離級別表示一個事務可以讀取另一個事務修改但還沒有提交的數(shù)據(jù)抱冷。該級別不能防止臟讀和不可重復讀崔列,因此很少使用該隔離級別梢褐。

不同隔離級別可避免的并發(fā)問題

隔離級別 臟讀 不可重復讀 幻讀
串行化 Y Y Y
可重復讀 Y Y
讀已提交 Y
讀未提交

2旺遮、應用

當一個事務未完成之前赵讯,寫操作不會真正寫入數(shù)據(jù)庫。同時需要注意耿眉,一個事務是以提交(commit)或者回滾(rollback)結(jié)束边翼,否則會發(fā)生死鎖,導致表被鎖死鸣剪,之后的任何正確操作都不會成功组底。

2.1 MySQL事務的應用

查看隔離級別語句:SELECT @@TX_ISOLATION;啟用事務:START TRANSACTION;設置隔離級別:set [global/session]  transaction isolation level;提交:COMMIT;回滾:ROLLBACK;
# 開啟事務START TRANSACTION;  # 執(zhí)行事務 SQL 語句 # SQL1 UPDATE Test_TableSET name = hhhWHERE id = 1;  # SQL2 UPDATE Test_TableSET name = xxxWHERE id = 2;  # 提交事務 COMMIT;

2.2 JDBC事務的應用

//設置隔離級別conn.setTransactionIsolation(TRANSACTION_READ_UNCOMMITTED);  //啟用事務conn.setAutoCommit(false);  //提交conn.commit(); //回滾conn.rollback();
try{    conn = jdbcTest.getConnection(sHostName, sPortNumber, sSid, userName, password);    
conn.setTransactionIsolation(TRANSACTION_REPEATABLE_READ);  
conn.setAutoCommit(false);  
String SQL = "insert into Test_Table values('name1','age1')";   
jdbcTest.excute(conn, SQL); 
SQL = "insert into Test_Table values('name2','age2')";  
jdbcTest.excute(conn, SQL); 
conn.commit();} 
catch (SQLException e){ 
if (conn != null)   {       
try     {           
conn.rollback();        
} catch (SQLException e1)       {
            e1.printStackTrace();       
}   
}   
e.printStackTrace();} 
finally{    if (conn != null)   
{       
try     
{           
conn.close();       
} catch (SQLException e)        {
            e.printStackTrace();        
}   
}}

原文作者:萌太隆

原文地址:https://blog.csdn.net/swl979623074/article/details/79416470

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市筐骇,隨后出現(xiàn)的幾起案子债鸡,更是在濱河造成了極大的恐慌,老刑警劉巖铛纬,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厌均,死亡現(xiàn)場離奇詭異,居然都是意外死亡告唆,警方通過查閱死者的電腦和手機棺弊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來擒悬,“玉大人模她,你說我怎么就攤上這事《粒” “怎么了侈净?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長僧凤。 經(jīng)常有香客問我用狱,道長,這世上最難降的妖魔是什么拼弃? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任夏伊,我火速辦了婚禮,結(jié)果婚禮上吻氧,老公的妹妹穿的比我還像新娘溺忧。我一直安慰自己,他們只是感情好盯孙,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布鲁森。 她就那樣靜靜地躺著,像睡著了一般振惰。 火紅的嫁衣襯著肌膚如雪歌溉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天,我揣著相機與錄音痛垛,去河邊找鬼草慧。 笑死,一個胖子當著我的面吹牛匙头,可吹牛的內(nèi)容都是我干的漫谷。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼蹂析,長吁一口氣:“原來是場噩夢啊……” “哼舔示!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起电抚,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤惕稻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蝙叛,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缩宜,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年甥温,在試婚紗的時候發(fā)現(xiàn)自己被綠了锻煌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡姻蚓,死狀恐怖宋梧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情狰挡,我是刑警寧澤捂龄,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站加叁,受9級特大地震影響倦沧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜它匕,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一展融、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧豫柬,春花似錦告希、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至础嫡,卻和暖如春指么,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工伯诬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留晚唇,地道東北人。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓姑廉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親翁涤。 傳聞我的和親對象是個殘疾皇子桥言,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350