1. 程式人生 > >SpringMVC 中Transactional註解的巨坑

SpringMVC 中Transactional註解的巨坑

最近的一個專案中對資料庫事務的處理要求比較嚴格。比如要完成業務A,需要完成操作1和操作2, 如果操作1失敗,則業務A要整體回滾;如果操作2失敗, 則僅需回滾操作2的資料,操作1的資料要留下來。因此整個業務算是兩個事務。

發現的問題

以前並沒有認真整理過程式碼的結構,這次要實現上述要求在事務標籤的放置位置上遇到了一個奇怪的問題。業務我放在一個Manager中處理,操作可能放在Service層,或者有些也放在Manager中,結果如上的業務A,我的程式碼結構經歷瞭如下幾種調整:

位置1

如下程式碼進能儲存op1()的資料,op2()資料無法儲存。

public class Manager
{
public void bus1(args) throws Exception { op1(); op2(); } @Transactional public void op1() throws Exception{} @Transactional public void op2() throws Exception{} }

位置2

遇到位置1的問題後,我在bus1上也加了標籤,可以儲存op1,op2的資料了,但是op2出錯的時候把op1的操作也回滾了。顯然不能滿足要求。

public class
Manager{
@Transactional public void bus1(args) throws Exception { op1(); op2(); } @Transactional public void op1() throws Exception{} @Transactional public void op2() throws Exception{} }

對於這個問題,我先後嘗試了更改事務傳播屬性,指定回滾的異常型別等等操作均無效。整死寶寶了O_O

問題原因

後來誤打誤撞,從論壇上查到一個人遇到過同樣的問題,提到了AOP相關的問題,說是若指定Spring api在處理Transactional標籤的時候,若在同一個類中無論遇到多少個事務,都會當成一個事務處理。。。。WTF
於是嘗試更改程式碼結構如下:

public class Manager{

    @Resource(name = "serviceImple")
    private Service service;

    public void bus1() throws Exception{
        service.op1();
        service.op2();
    }

}

public class ServiceImpl implements Service{

    @Override
    @Transactional
    public void op1() throws Exception{}



    @Override
    @Transactional
    public void op2() throws Exception{}

}

重新嘗試,事務提交成功,異常回滾成功!

SO

作為半路出家的程式設計師,對於一些基礎知識的儲備還是很重要的,不然出問題了,連怎麼查問題都不知道=.=。
PS:程式碼結構神馬的也得好好整理整理了。。。

相關推薦

SpringMVC Transactional註解

最近的一個專案中對資料庫事務的處理要求比較嚴格。比如要完成業務A,需要完成操作1和操作2, 如果操作1失敗,則業務A要整體回滾;如果操作2失敗, 則僅需回滾操作2的資料,操作1的資料要留下來。因此整個業務算是兩個事務。 發現的問題 以前並沒有認真整理過程式碼

springMVC註解@RequestParam與@PathVariable的區別

actor nal lencod mat 控制 關系 tor oid 沒有 @PathVariable綁定URI模板變量值 @PathVariable是用來獲得請求url中的動態參數的 @PathVariable用於將請求URL中的模板變量映射到功能處理方法的參數上。//配

springmvc@requestbody註解接收請求引數

一、POST請求的四種常用方式   1、application/x-www-form-urlencoded     瀏覽器原生的表單,值為urlencoded之後的  key1=value1&key2=value2......   2、multipart/form-data     

springmvc@requestbody註解接收請求參數

pri 傳輸 四種 文件表 multi post 傳輸文件 解析json 方式 一、POST請求的四種常用方式   1、application/x-www-form-urlencoded     瀏覽器原生的表單,值為urlencoded之後的 key1=value1&a

SpringMVC@ModelAttribute註解的作用

[email protected]註釋void返回值的方法 [java] view plain copy   print? @Controller   public class HelloModelController {       @Mo

關於springMVC@ModelAttribute註解的隱含model屬性名

springMVC中對現有的部落格的小補充 宣告:本人菜鳥一個,這次是第一次寫部落格,可能格式有點不好,請見諒, 如有不正確歡迎前來斧正。 序言:寫這篇部落格的原因:是我在使用一個框架時遇到的問題,百度了很多部落格和知乎等等都沒有什麼收穫,後來弄

spring@Transactional註解丟擲異常不回滾的現象

  文章轉載至:http://blog.csdn.net/qq_14874941/article/details/52808520 今天在開發中,遇到了如題這樣的問題,我自己手動丟擲異常,資料還是會寫入的資料庫中,並且不會發生回滾,導致產生了垃圾資料。後來上網查了一

springmvc@requestbody註解接收前端引數使用content-type型別

最近程式碼遇見了一個springmvc中的小問題,算是很基礎的東西,同事問我後我有有些迷惑上網找了一些資料後弄清楚了。特此記錄一下 首先是後臺程式碼使用springmvc註解@requestbody,

springmvc 輸出json格式數據的幾種方式!

mapping cep process 添加 exc 文件中 != style find 最近公司項目需要發布一些數據服務,從設計到實現兩天就弄完了,心中竊喜之。 結果臨近部署時突然發現。。。。。 服務輸出的JSON 數據中 date 類型數據輸出格式要麽是時間戳,要麽

SpringMVC的一些註解

gmv pub pan else bsp break () 獲取參數 false @Controller:表明該類是一個Controller; @RequestMapping(參數) :為類或者方法定義一個url @RequestParam(value = "id" ):

總結本次實訓springMVC常用的註解@,以後用到別的會持續更新

col ring key值 ppi div jsp頁面 ajax請求 map spa @Repository //dao層註解。聲明本層為dao層。 @serivce //service層。 @controller //con層。 @auto

SpringMVC用於綁定請求數據的註解以及配置視圖解析器

SpringMVC 視圖解析器 @RequestHeader 綁定集合參數 @CookieValue SpringMVC中用於綁定請求數據的註解 在上一篇文章中我們簡單介紹了@RequestMapping與@RequestParam註解,知道了如何去配置地址映射,本篇則介紹一些用於處理re

大佬教你在springMVC使用dubbo註解配置的問題

ica .get -s sta for dispatch 自動 xtu ces 問題,在controller中無法通過註解自動註入dubbo服務,但是在service中可以自動註入。package com.sl;@Controllerbr/>//期望註入dubbo服務@Re

Spring Boot 使用 @Transactional 註解配置事務管理

all arc obj 資料 ror 科學 部分 直接 true 事務管理是應用系統開發中必不可少的一部分。Spring 為事務管理提供了豐富的功能支持。Spring 事務管理分為編程式和聲明式的兩種方式。編程式事務指的是通過編碼方式實現事務;聲明式事務基於 AOP,將具體

數據庫事務的隔離級別和鎖+spring Transactional註解

遇到 丟失更新 讀鎖 討論 acid 通過 行修改 nal dbms 數據庫事務中的隔離級別和鎖 數據庫事務在後端開發中占非常重要的地位,如何確保數據讀取的正確性、安全性也是我們需要研究的問題。 ACID 首先總結一下數據庫事務正確執行的四個要素(ACID): 原子性(At

SpringMVC@RequestMapping處理請求引數的@RequestParam註解

首先在頁面新增一個帶有引數的請求,分別是username和age <a href="springmvc/testRequestParam?username=yoni&age=20">Test RequestParam</a> 然後在類中新增方法

SpringMVC的@RequestMapping註解的@PathVariable註解

先看程式碼,程式碼如下: package com.yoni.springmvc.handlers; import org.springframework.stereotype.Controller; import org.springframework.web.bind.a

SpringMVC的RequestMapping修飾類註解

@RequestMapping 該註解除了能修飾方法,還能修飾類。 如上一文章中提到的程式碼,修改後得到: package com.yoni.springmvc.handlers; import org.springframework.stereotype.Controlle

spring專案新增@Transactional註解後出現NoSuchBeanDefinitionException異常的解決方法

配置檔案裡這一句<tx:annotation-driven transaction-manager="transactionManager"/> 改成 <tx:annotation-driven transaction-manager="transac

第三方SDK

開發中經常會使用第三方SDK,尤其是那些看不到原始碼的SDK。出現了崩潰真是無處下手。由於最近又遇到一個之前遇到的錯誤,今天分享一下: 執行程式會出現如下錯誤資訊: was compiled with optimization - stepping may behave oddly;