事務(wù)詳解

一致份、事務(wù)的概念

事務(wù)指邏輯上的一組操作逻族,組成這組操作的各個單元,要不全部成功束昵,要不全部不成功拔稳。
例如:A——B轉(zhuǎn)帳,對應(yīng)于如下兩條sql語句
update from account set money=money+100 where name=‘b’;
update from account set money=money-100 where name=‘a(chǎn)’;

二锹雏、事務(wù)的使用

  1. JDBC開啟事務(wù)的命令
    start transaction 開啟事務(wù)
    Rollback 回滾事務(wù)
    Commit 提交事務(wù)
  2. 當Jdbc程序向數(shù)據(jù)庫獲得一個Connection對象時巴比,默認情況下這個Connection對象會自動向數(shù)據(jù)庫提交在它上面發(fā)送的SQL語句。若想關(guān)閉這種默認提交方式礁遵,讓多條SQL在一個事務(wù)中執(zhí)行轻绞,可使用下列語句:
  3. JDBC控制事務(wù)語句
    Connection.setAutoCommit(false);
    Connection.rollback();
    Connection.commit();

三、事務(wù)的特性

  • 原子性(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ā)生故障也不應(yīng)該對其有任何影響薛窥。

以談戀愛為例子理解:
A:原子性,即要么泡妞成功褐墅,要么泡妞不成功拆檬,絕對不能出現(xiàn)曖昧不清的情況
C:一致性洪己,即如果對方對你好,你就不能耍脾氣竟贯,也要對對方好答捕,狀態(tài)要保持一致
I:隔離性,談戀愛期間錢歸錢屑那,愛歸愛拱镐,兩者不能混淆,愛不應(yīng)收到窮富的干擾
D:持久性持际,這個你懂的沃琅。。蜘欲。益眉。。姥份。郭脂。別誤解了,我指的是戀愛這個應(yīng)該是一輩子的澈歉,是永久性的
出自http://www.zhihu.com/question/30272728

四罐脊、事務(wù)的隔離級別

  1. 多個線程開啟各自事務(wù)操作數(shù)據(jù)庫中數(shù)據(jù)時吏恭,數(shù)據(jù)庫系統(tǒng)要負責隔離操作尉咕,以保證各個線程在獲取數(shù)據(jù)時的準確性蟋恬。如果不考慮隔離性,可能會引發(fā)如下問題:
a. 臟讀:指一個事務(wù)讀取了另外一個事務(wù)未提交的數(shù)據(jù)

假設(shè)A向B轉(zhuǎn)帳100元涡尘,對應(yīng)sql語句如下所示
1.update account set money=money+100 while name=‘b’;
2.update account set money=money-100 while name=‘a(chǎn)’;
當?shù)?條sql執(zhí)行完忍弛,第2條還沒執(zhí)行(A未提交時),如果此時B查詢自己的帳戶考抄,就會發(fā)現(xiàn)自己多了100元錢剧罩。如果A等B走后再回滾,B就會損失100元座泳。

b. 不可重復讀:在一個事物內(nèi)讀取表中的某一行數(shù)據(jù)惠昔,多次讀取結(jié)果不同。

例如銀行想查詢A帳戶余額挑势,第一次查詢A帳戶為200元镇防,此時A向帳戶內(nèi)存了100元并提交了,銀行接著又進行了一次查詢潮饱,此時A帳戶為300元了来氧。銀行兩次查詢不一致,可能就會很困惑,不知道哪次查詢是準的啦扬。
和臟讀的區(qū)別是中狂,臟讀是讀取前一事務(wù)未提交的臟數(shù)據(jù),不可重復讀是重新讀取了前一事務(wù)已提交的數(shù)據(jù)扑毡。
很多人認為這種情況就對了胃榕,無須困惑,當然是后面的為準瞄摊。我們可以考慮這樣一種情況勋又,比如銀行程序需要將查詢結(jié)果分別輸出到電腦屏幕和寫到文件中,結(jié)果在一個事務(wù)中針對輸出的目的地换帜,進行的兩次查詢不一致楔壤,導致文件和屏幕中的結(jié)果不一致,銀行工作人員就不知道以哪個為準了惯驼。

c. 虛讀:是指在一個事務(wù)內(nèi)讀取到了別的事務(wù)插入的數(shù)據(jù)蹲嚣,導致前后讀取不一致

如丙存款100元未提交,這時銀行做報表統(tǒng)計account表中所有用戶的總額為500元祟牲,然后丙提交了端铛,這時銀行再統(tǒng)計發(fā)現(xiàn)帳戶為600元了,造成虛讀同樣會使銀行不知所措疲眷,到底以哪個為準。

2. 數(shù)據(jù)庫四種隔離級別:

a. Serializable:可避免臟讀您朽、不可重復讀狂丝、虛讀情況的發(fā)生。(串行化)它會鎖表哗总,可以解決所有問題.
b. Repeatable read:可避免臟讀几颜、不可重復讀情況的發(fā)生。(可重復讀)可以解決臟讀讯屈,可以解決不可重復讀,不能解決虛讀.
c. Read committed:可避免臟讀情況發(fā)生蛋哭。(讀已提交)可以解決臟讀,其它解決不了
d. Read uncommitted:最低級別涮母,以上情況均無法保證谆趾。(讀未提交)什么問題也解決不了

安全性:serializable > repeatable read > read committed > read uncommitted
性能 :serializable < repeatable read < read committed < read uncommitted

結(jié)論: 實際開發(fā)中,通常不會選擇 serializable 和 read uncommitted 叛本,mysql默認隔離級別 repeatable read 沪蓬,oracle默認隔離級別 read committed

3. 設(shè)置隔離級別
a. mysql中設(shè)置

i. 查看事務(wù)隔離級別
select @@tx_isolation 查詢當前事務(wù)隔離級別
mysql中默認的事務(wù)隔離級別是 Repeatable read.
ii. 擴展:oracle 中默認的事務(wù)隔離級別是 Read committed
iii. mysql中怎樣設(shè)置事務(wù)隔離級別
set session transaction isolation level 設(shè)置事務(wù)隔離級別

b. jdbc中設(shè)置

i. 在jdbc中設(shè)置事務(wù)隔離級別
使用java.sql.Connection接口中提供的方法
void setTransactionIsolation(int level) throws SQLException
ii. 參數(shù)level可以取以下值:
level - 以下 Connection 常量之一:
Connection.TRANSACTION_READ_UNCOMMITTED、
Connection.TRANSACTION_READ_COMMITTED来候、
Connection.TRANSACTION_REPEATABLE_READ
Connection.TRANSACTION_SERIALIZABLE跷叉。
iii. 注意,不能使用 Connection.TRANSACTION_NONE,因為它指定了不受支持的事務(wù)云挟。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末梆砸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子园欣,更是在濱河造成了極大的恐慌帖世,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俊庇,死亡現(xiàn)場離奇詭異狮暑,居然都是意外死亡,警方通過查閱死者的電腦和手機辉饱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門搬男,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人彭沼,你說我怎么就攤上這事缔逛。” “怎么了姓惑?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵褐奴,是天一觀的道長。 經(jīng)常有香客問我于毙,道長敦冬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任唯沮,我火速辦了婚禮脖旱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘介蛉。我一直安慰自己萌庆,他們只是感情好,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布币旧。 她就那樣靜靜地躺著践险,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吹菱。 梳的紋絲不亂的頭發(fā)上巍虫,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天,我揣著相機與錄音鳍刷,去河邊找鬼垫言。 笑死,一個胖子當著我的面吹牛倾剿,可吹牛的內(nèi)容都是我干的筷频。 我是一名探鬼主播蚌成,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼凛捏!你這毒婦竟也來了担忧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤坯癣,失蹤者是張志新(化名)和其女友劉穎瓶盛,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體示罗,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡惩猫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蚜点。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片轧房。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖绍绘,靈堂內(nèi)的尸體忽然破棺而出奶镶,到底是詐尸還是另有隱情,我是刑警寧澤陪拘,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布厂镇,位于F島的核電站,受9級特大地震影響左刽,放射性物質(zhì)發(fā)生泄漏捺信。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一欠痴、第九天 我趴在偏房一處隱蔽的房頂上張望迄靠。 院中可真熱鬧,春花似錦斋否、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至舅世,卻和暖如春旦委,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背雏亚。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工缨硝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人罢低。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓查辩,卻偏偏與公主長得像胖笛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子宜岛,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

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

  • 基本概念 事務(wù)指邏輯上的一組操作长踊,組成這組操作的各個單元,要么全部成功萍倡,要么全部不成功身弊。 事務(wù)類型 JDBC事務(wù) ...
    Jack4J閱讀 667評論 0 3
  • 1. 關(guān)于事務(wù) 事務(wù)控制就是將一系列操作當成一個不可拆分的邏輯單元,保證這些操作要么都成功列敲,要么都失敗阱佛。在關(guān)系數(shù)據(jù)...
    七弦桐語閱讀 2,880評論 0 14
  • 1. 簡介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL戴而、存儲過程以及高級映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,429評論 0 4
  • 事務(wù)特性ACID 如果一個數(shù)據(jù)庫聲稱支持事務(wù)的操作凑术,那么該數(shù)據(jù)庫必須要具備以下四個特性: 1 原子性(Atomic...
    Q南南南Q閱讀 918評論 0 0
  • casyon5陽頌 打卡 2016.11.25 弗洛伊德的精神分析理論中將人的精神意識分為意識、前意識填硕、無意識三層...
    Casyon陽頌閱讀 1,921評論 0 0