10

事務(wù)的含義:

事務(wù)可以看作是由對(duì)數(shù)據(jù)庫(kù)的若干操作組成的一個(gè)單元唉铜,這些操作要么都完成,要么都取消,從而保證數(shù)據(jù)滿足一致性的要求浙巫。

事務(wù)的一個(gè)典型例子是銀行中的轉(zhuǎn)帳操作,帳戶A把一定數(shù)量的款項(xiàng)轉(zhuǎn)到帳戶B上刷后,這個(gè)操作包括兩個(gè)步驟的畴,一個(gè)是從帳戶A上把存款減去一定數(shù)量,二是在帳戶B上把存款加上相同的數(shù)量尝胆。這兩個(gè)步驟顯然要么都完成丧裁,要么都取消,否則銀行就會(huì)受損失含衔。顯然煎娇,這個(gè)轉(zhuǎn)帳操作中的兩個(gè)步驟就構(gòu)成一個(gè)事務(wù)。

事務(wù)的四個(gè)特征(ACID)

1.原子性(Atomicity):指事務(wù)中的操作抱慌,或者都完成逊桦,或者都取消。

2.一致性(Consistency):指事務(wù)中的操作保證數(shù)據(jù)庫(kù)中的數(shù)據(jù)不會(huì)出現(xiàn)邏輯上不一致的情況抑进,一致性一般會(huì)隱含的包括在其他屬性之中强经。

3.隔離性(Isolation):指當(dāng)前的事務(wù)與其他未完成的事務(wù)是隔離的。在不同的隔離級(jí)別下寺渗,事務(wù)的讀取操作匿情,得到的結(jié)果可能是不同的。

4.持久性(Durability):指對(duì)事務(wù)發(fā)出COMMIT命令后信殊,即使這時(shí)發(fā)生系統(tǒng)故障炬称,事務(wù)的結(jié)果也被持久化了。與此相反的是涡拘,當(dāng)在事務(wù)執(zhí)行過(guò)程中玲躯,系統(tǒng)發(fā)生故障時(shí),則事務(wù)的操作都被回滾,即數(shù)據(jù)庫(kù)回到事務(wù)開(kāi)始之前的狀態(tài)跷车。

如果沒(méi)有采取必要的隔離機(jī)制, 就會(huì)導(dǎo)致各種并發(fā)問(wèn)題:

1.更新丟失:
本來(lái)是:
1000-200=800
800-300=500
1000更新為500

錯(cuò)誤:
1000-200=800
1000-300=700
1000更新為700

2.臟數(shù)據(jù):
1000元更新為800元棘利,最后更新為500元⌒嘟桑可是讀取到的是中間的800元善玫。

3.不可重復(fù)讀
第一次讀取的數(shù)據(jù)和第二次讀取的數(shù)據(jù)不一致

4.幻讀:
第一次讀取到了3行數(shù)據(jù),然后有人刪除了1行數(shù)據(jù)密强,讀取到的數(shù)據(jù)變成了2行茅郎。

數(shù)據(jù)庫(kù)系統(tǒng)必須具有隔離并發(fā)運(yùn)行各個(gè)事務(wù)的能力, 使它們不會(huì)相互影響, 避免各種并發(fā)問(wèn)題。

不同隔離級(jí)別對(duì)應(yīng)不同的干擾程度, 隔離級(jí)別越高, 數(shù)據(jù)一致性就越好, 但并發(fā)性越弱或渤。

ANSI SQL標(biāo)準(zhǔn)定義了 4 種事務(wù)隔離級(jí)別:

image.png

SQL Server支持4中事務(wù)隔離級(jí)別系冗,默認(rèn)級(jí)別為: READ COMMITTED

盡管讓程序自主管理 Session 對(duì)象的生命周期也是可行的, 但是在實(shí)際Java應(yīng)用中, 把管理Session對(duì)象的生命周期交給 Hibernate管理, 可以簡(jiǎn)化Java應(yīng)用程序代碼和軟件架構(gòu)。

Hibernate提供了三種管理 Session 對(duì)象的方法:
1.Session對(duì)象的生命周期與本地線程綁定(我們學(xué)的)
記得配置cfg:<property name="current_session_context_class">thread</property>

2.Session對(duì)象的生命周期與JTA事務(wù)綁定
3.Hibernate委托程序管理Session對(duì)象的生命周期

在 Hibernate的配置文件中, current_session_context_class屬性用于指定Session管理方式, 可選值包括:
thread: Session對(duì)象的生命周期與本地線程綁定
jta: Session對(duì)象的生命周期與JTA事務(wù)綁定
managed: Hibernate委托程序來(lái)管理Session對(duì)象的生命周期

安全:一個(gè)線程劳坑,一個(gè)session

當(dāng)配置為thread時(shí)毕谴,SessionFactory的getCurrentSession()方法才能使用

當(dāng)一個(gè)線程(threadA)第一次調(diào)用 SessionFactory 對(duì)象的getCurrentSession() 方法時(shí), 該方法會(huì)創(chuàng)建一個(gè)新的Session(sessionA) 對(duì)象, 把該對(duì)象與threadA綁定, 并將sessionA返回

當(dāng)threadA再次調(diào)用SessionFactory對(duì)象的 getCurrentSession()方法時(shí), 該方法將返回sessionA對(duì)象

當(dāng)threadA提交sessionA對(duì)象關(guān)聯(lián)的事務(wù)時(shí),Hibernate會(huì)自動(dòng)清理sessionA對(duì)象的緩存, 然后提交事務(wù), 關(guān)閉sessionA對(duì)象。 當(dāng)threadA撤銷sessionA對(duì)象關(guān)聯(lián)的事務(wù)時(shí), 也會(huì)自動(dòng)關(guān)閉sessionA對(duì)象(也就是使用getCurrentSession() 獲取session不需要自行關(guān)閉)

若threadA再次調(diào)用SessionFactory對(duì)象的getCurrentSession()方法時(shí), 該方法會(huì)又創(chuàng)建一個(gè)新的 Session(sessionB)對(duì)象, 把該對(duì)象與threadA綁定, 并將sessionB返回

可以不用getCurrentSession()方法距芬,用ThreadLocal實(shí)現(xiàn)(jdk提供的)

ThreadLocal為解決多線程程序的并發(fā)問(wèn)題提供了一種新的思路涝开,ThreadLocal并不是一個(gè)Thread,而是Thread的局部變量框仔。

注意:獲取session需要自行關(guān)閉舀武。

s_h例子

對(duì)于WEB應(yīng)用,一個(gè)請(qǐng)求可能需要多次操作數(shù)據(jù)庫(kù)并返回?cái)?shù)據(jù)至JSP中進(jìn)行顯示离斩,可能有以上兩個(gè)問(wèn)題要考慮:
1.多次操作數(shù)據(jù)庫(kù)如何共享一個(gè)事務(wù)银舱?

2.對(duì)于懶加載的實(shí)體類,返回到JSP頁(yè)面時(shí)若session已關(guān)閉跛梗,那么就取不到這個(gè)實(shí)體的數(shù)據(jù)了寻馏,如何處理這類問(wèn)題?

說(shuō)明:事務(wù)從Service層開(kāi)始核偿,要取數(shù)據(jù)的時(shí)候诚欠,session關(guān)閉了,進(jìn)行不了以下過(guò)程漾岳。

闡述Session加載實(shí)體對(duì)象的過(guò)程:
① Session在調(diào)用數(shù)據(jù)庫(kù)查詢功能之前轰绵,首先會(huì)在一級(jí)緩存中通過(guò)實(shí)體類型和主鍵進(jìn)行查找,如果一級(jí)緩存查找命中且數(shù)據(jù)狀態(tài)合法尼荆,則直接返回左腔;
② 如果一級(jí)緩存沒(méi)有命中,接下來(lái)Session會(huì)在當(dāng)前NonExists記錄(相當(dāng)于一個(gè)查詢黑名單捅儒,如果出現(xiàn)重復(fù)的無(wú)效查詢可以迅速做出判斷液样,從而提升性能)中進(jìn)行查找振亮,如果NonExists中存在同樣的查詢條件,則返回null蓄愁;
③ 如果一級(jí)緩存查詢失敗則查詢二級(jí)緩存双炕,如果二級(jí)緩存命中則直接返回;
④ 如果之前的查詢都未命中撮抓,則發(fā)出SQL語(yǔ)句,如果查詢未發(fā)現(xiàn)對(duì)應(yīng)記錄則將此次查詢添加到Session的NonExists中加以記錄摇锋,并返回null丹拯;
⑤ 根據(jù)映射配置和SQL語(yǔ)句得到ResultSet,并創(chuàng)建對(duì)應(yīng)的實(shí)體對(duì)象荸恕;
⑥ 將對(duì)象納入Session(一級(jí)緩存)的管理乖酬;
⑦ 如果有對(duì)應(yīng)的攔截器,則執(zhí)行攔截器的onLoad方法融求;
⑧ 如果開(kāi)啟并設(shè)置了要使用二級(jí)緩存咬像,則將數(shù)據(jù)對(duì)象納入二級(jí)緩存;
⑨ 返回?cái)?shù)據(jù)對(duì)象生宛。

Action用到 Service
Service 用到 DAO

過(guò)濾器 用到 HibernateUtil 和 HibernateSessionFactory

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末县昂,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子陷舅,更是在濱河造成了極大的恐慌倒彰,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件莱睁,死亡現(xiàn)場(chǎng)離奇詭異待讳,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)仰剿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門创淡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人南吮,你說(shuō)我怎么就攤上這事琳彩。” “怎么了旨袒?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵汁针,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我砚尽,道長(zhǎng)施无,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任必孤,我火速辦了婚禮猾骡,結(jié)果婚禮上瑞躺,老公的妹妹穿的比我還像新娘。我一直安慰自己兴想,他們只是感情好幢哨,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著嫂便,像睡著了一般捞镰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上毙替,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天岸售,我揣著相機(jī)與錄音,去河邊找鬼厂画。 笑死凸丸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的袱院。 我是一名探鬼主播屎慢,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼忽洛!你這毒婦竟也來(lái)了腻惠?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤脐瑰,失蹤者是張志新(化名)和其女友劉穎妖枚,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體苍在,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绝页,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了寂恬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片续誉。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖初肉,靈堂內(nèi)的尸體忽然破棺而出酷鸦,到底是詐尸還是另有隱情,我是刑警寧澤牙咏,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布臼隔,位于F島的核電站,受9級(jí)特大地震影響妄壶,放射性物質(zhì)發(fā)生泄漏摔握。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一丁寄、第九天 我趴在偏房一處隱蔽的房頂上張望氨淌。 院中可真熱鬧泊愧,春花似錦、人聲如沸盛正。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)豪筝。三九已至痰滋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間续崖,已是汗流浹背即寡。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留袜刷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓莺丑,卻偏偏與公主長(zhǎng)得像著蟹,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子梢莽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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