Spring的setRollbackOnly()

在之前的文章中静秆,我們講過如果有兩個事務,A和B严衬,均是Required new的傳遞類型澄者,而我們在A中調(diào)用B。如果B中拋出了異常(RuntimeException请琳,Spring的事務機制只會補貨RumtimeException)粱挡,而A中將異常進行了catch,則A會拋出以下的錯誤

Exception in thread "main" org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only

從而強制將事務進行回滾俄精,Spring采用該機制是為了防止用戶錯誤的將引發(fā)回滾的異常進行捕獲而忘記繼續(xù)拋出询筏。
以下的例子展示了這種情況:

@Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void testTransaction() {
        LOGGER.info("start test transaction");
        CustApplyTicketService service = ApplicationContextHolder.getBean("transactionService",
                TransactionService.class);
        Person person = new Person();
        person.setName("測試");
        service.saveEntitySelective(ticket);
        try {
            service.testInnerTransaction();
        } catch (Exception e) {
            LOGGER.error("", e);
        }
        LOGGER.info("finish test transaction");
    }

    @Override
    @Transactional
    public void testInnerTransaction() {
        throw new RuntimeException("this is a inner exception");
    }

    public static void main(String[] args) {
            ApplicationContext ac = new ClassPathXmlApplicationContext("conf/applicationContext-test.xml");
            TransactionService service = ac.getBean("transactionService", TransactionService.class);
            service.testTransaction();
    }

那有的時候,我們有這種需求竖慧,我們就是希望A回滾屈留,但是又不想通過這種方式拋出異常來進行。那有沒有不拋出異常的回滾方式呢测蘑?
我們可以通過設置TransactionStatus的rollBackOnly標志位的方式來實現(xiàn)。
比如如下的方式:

@Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void testTransaction() {
        LOGGER.info("start test transaction");
        CustApplyTicketService service = ApplicationContextHolder.getBean("transactionService",
                TransactionService.class);
        Person person = new Person();
        person.setName("測試");
        service.saveEntitySelective(ticket);
        try {
            service.testInnerTransaction();
        } catch (Exception e) {
            LOGGER.error("", e);
           // 這部是關鍵
           TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
        LOGGER.info("finish test transaction");
    }

    @Override
    @Transactional
    public void testInnerTransaction() {
        throw new RuntimeException("this is a inner exception");
    }

    public static void main(String[] args) {
            ApplicationContext ac = new ClassPathXmlApplicationContext("conf/applicationContext-test.xml");
            TransactionService service = ac.getBean("transactionService", TransactionService.class);
            service.testTransaction();
    }

在上面康二,我們并不會收到UnexpectedRollbackException的異常碳胳。而由于我們?nèi)斯さ脑O置了回滾標志,所以數(shù)據(jù)庫仍會進行回滾沫勿。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末挨约,一起剝皮案震驚了整個濱河市味混,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌诫惭,老刑警劉巖翁锡,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異夕土,居然都是意外死亡馆衔,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門怨绣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來角溃,“玉大人,你說我怎么就攤上這事篮撑〖跸福” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵赢笨,是天一觀的道長未蝌。 經(jīng)常有香客問我,道長茧妒,這世上最難降的妖魔是什么萧吠? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮嘶伟,結(jié)果婚禮上怎憋,老公的妹妹穿的比我還像新娘。我一直安慰自己九昧,他們只是感情好绊袋,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著铸鹰,像睡著了一般癌别。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蹋笼,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天展姐,我揣著相機與錄音,去河邊找鬼剖毯。 笑死圾笨,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的逊谋。 我是一名探鬼主播擂达,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼胶滋!你這毒婦竟也來了板鬓?” 一聲冷哼從身側(cè)響起悲敷,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎俭令,沒想到半個月后后德,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡抄腔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年瓢湃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妓柜。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡箱季,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出棍掐,到底是詐尸還是另有隱情藏雏,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布作煌,位于F島的核電站掘殴,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏粟誓。R本人自食惡果不足惜奏寨,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鹰服。 院中可真熱鬧病瞳,春花似錦、人聲如沸悲酷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽设易。三九已至逗柴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間顿肺,已是汗流浹背戏溺。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留屠尊,地道東北人旷祸。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像讼昆,于是被迫代替她去往敵國和親肋僧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)嫌吠,斷路器,智...
    卡卡羅2017閱讀 134,672評論 18 139
  • 光芒越來越近 你卻越來越遠 我們曾愛過 可是 曾經(jīng)只是曾經(jīng) 愿她一身婚紗 換你一世真心 我愛你
    姜大欣閱讀 210評論 0 0
  • “我害怕一種固定而且重復的生活〗ǎ“ “我害怕自己的生命在固定而且重復的生活中變成一種原地踏步的機械式的循環(huán)炕矮。” “...
    陳妥閱讀 769評論 2 13
  • “臨兵斗者者冤,皆陣列在前肤视!孔雀不動明王咒!“ 從小不是一個好學生涉枫,所以教材沒有好好念邢滑,雜七雜八的書看了不少,尤其日本...
    本來源起閱讀 400評論 0 51
  • 對于“界限感”,我覺得很容易被人忽視衬廷,不管是在家庭中還是職場里摇予,“界限感”不清晰就會引發(fā)各類誤會和矛盾。 ...
    方智永閱讀 256評論 0 1