Spring事務與數據庫事務的交互原理

Spring事務和數據庫事務到底是什么關系?

Spring事務是如何傳遞到數據庫的适袜?


首先柄错,我們來回憶一下jdbc這個api,這是java操作數據庫的入口痪蝇,是java操作數據庫的通道鄙陡,是我們與數據庫打交道的必經之路。那么躏啰,是不是說趁矾,Spring的事務控制就是通過jdbc傳遞到數據庫,然后執(zhí)行的呢?我個人覺得皿桑,就是這樣,并且也只有這樣截酷。


繼續(xù)回憶蔓同,jdbc怎么操作數據庫呢饶辙?首先建立連接,然后執(zhí)行增刪改查斑粱,然后關閉數據庫連接弃揽。如果你需要事務控制,那么就把Connection的自動提交關閉:

con.setAutoCommit(false);

然后在需要提交事務時顯示提交就可以了则北。

con.commit();


這就是jdbc操作數據庫的方式矿微。


接下來,我們繼續(xù)深入研究一下尚揣,應用程序通過jdbc把數據庫操作sql發(fā)送到DBMS以后涌矢,DBMS如何進行事務控制呢?


這個就是數據庫的工作原理了快骗,如果數據庫支持事務娜庇,那么數據庫首先會開啟事務,然后等到所有的sql都執(zhí)行完以后方篮,再提交事務名秀。就像我們在存儲過程中顯式的提交事務一樣。但是數據庫如何知道在哪個sql前開啟事務藕溅,執(zhí)行到哪里再關閉事務的呢泰偿?這個就是jdbc的實現細節(jié)了,感興趣的可以研究一下jdbc的源代碼蜈垮。


到這里耗跛,我們基本上可以回答開篇提出的疑問了。Spring整合Mybatis的架構中攒发,Mybatis是應用程序與數據庫通道调塌,是兩者交互的唯一通道。而Mybatis框架封裝的就是jdbc惠猿。


接下來羔砾,我們還要探討一下,Spring的事務傳播機制與數據庫的隔離級別的關系偶妖。

答:二者之間沒有關系姜凄。

Spring的事務傳播機制中的當前事務,指的是當前Spring的事務趾访,還是當前數據庫的事務态秧?

spring事務傳播機制如下:

REQUIRED

SUPPORTS

MANDATORY

REQURIED_NEW

NOT_SUPPORTED

NEVER

NESTED


數據庫的隔離級別如下:

READ_UNCIMMITED

READ_COMMITED

REPEATABLE_READ

SERIALIZABLE


默認設置是第一種:REQURIED,什么意思呢扼鞋?就是說申鱼,支持當前事務愤诱,如果當前沒有事務,就新建一個事務捐友,這是網上的說法淫半,說實話,這個說的有點晦澀難懂匣砖,如果不看Spring注解相關源碼科吭,根本理解不了。


于是乎猴鲫,我就去看事務的源碼了砌溺,看看Spring這個事務傳播機制到底是個什么意思。


源碼沒看懂变隔,先看一下@Transational注解的定義,內容還是挺豐富的蟹倾。主要包含以下屬性:

圖片發(fā)自簡書App


關于@Transational注解匣缘,需要注意以下幾個問題:

注意點: Spring默認情況下會對(RuntimeException)及其子類來進行回滾,在遇見Exception及其子類的時候則不會進行回滾操作鲜棠。


注意點: @Transactional既可以作用于接口肌厨,接口方法上以及類已經類的方法上。但是Spring官方不建議接口或者接口方法上使用該注解豁陆,因為這只有在使用基于接口的代理時它才會生效柑爸。另外, @Transactional 注解應該只被應用到 public 方法上盒音,這是由 Spring AOP 的本質決定的表鳍。如果你在 protected、private 或者默認可見性的方法上使用 @Transactional 注解祥诽,這將被忽略譬圣,也不會拋出任何異常。 Spring默認使用的是jdk自帶的基于接口的代理雄坪,而沒有使用基于類的代理CGLIB厘熟。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市维哈,隨后出現的幾起案子绳姨,更是在濱河造成了極大的恐慌,老刑警劉巖阔挠,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件飘庄,死亡現場離奇詭異,居然都是意外死亡购撼,警方通過查閱死者的電腦和手機竭宰,發(fā)現死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門空郊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人切揭,你說我怎么就攤上這事狞甚。” “怎么了廓旬?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵哼审,是天一觀的道長。 經常有香客問我孕豹,道長涩盾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任励背,我火速辦了婚禮春霍,結果婚禮上,老公的妹妹穿的比我還像新娘叶眉。我一直安慰自己址儒,他們只是感情好,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布衅疙。 她就那樣靜靜地躺著莲趣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪饱溢。 梳的紋絲不亂的頭發(fā)上喧伞,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天,我揣著相機與錄音绩郎,去河邊找鬼潘鲫。 笑死,一個胖子當著我的面吹牛肋杖,可吹牛的內容都是我干的次舌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼兽愤,長吁一口氣:“原來是場噩夢啊……” “哼彼念!你這毒婦竟也來了?” 一聲冷哼從身側響起浅萧,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤逐沙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后洼畅,有當地人在樹林里發(fā)現了一具尸體吩案,經...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年帝簇,在試婚紗的時候發(fā)現自己被綠了徘郭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片靠益。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖残揉,靈堂內的尸體忽然破棺而出胧后,到底是詐尸還是另有隱情,我是刑警寧澤抱环,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布壳快,位于F島的核電站,受9級特大地震影響镇草,放射性物質發(fā)生泄漏眶痰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一梯啤、第九天 我趴在偏房一處隱蔽的房頂上張望竖伯。 院中可真熱鬧,春花似錦因宇、人聲如沸七婴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至肩袍,卻和暖如春杭棵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背氛赐。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工魂爪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人艰管。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓滓侍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親牲芋。 傳聞我的和親對象是個殘疾皇子撩笆,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354