1. 程式人生 > >spring中service呼叫service的事務控制

spring中service呼叫service的事務控制

    在使用SPRING的事務控制時,事務一般都是加在SERVICE層的,這個時候如果一個SERVICE呼叫另一個

SERVICE時有可能會出現事務控制問題,比如第二個SERVICE丟擲了異常,第一個SERVICE卻正常提交了,

比如下面這個例子:

事務配置

<tx:method name="add*" propagation="REQUIRED"/>

測試程式碼

    @Test
    public void testAddUser() throws Exception {
        UserServiceImpl service = (UserServiceImpl) context.getBean("userServiceImpl", UserServiceImpl.class);
        USER u = new USER();
        u.setCreated("2015-05-05");
        u.setCreator(123);
        u.setName("test");
        u.setPassword("test");
        service.addUser(u);
    }

SERVICE層:
    public void addUser(USER user) throws Exception {
        userDaoImpl.saveUser(user);
        delByUsername(user.getName());
    }

    public void delByUsername(String name) throws Exception {
        throw new FileNotFoundException("fjkdl");
    }
    當第二個SERVICE丟擲異常的時候,第一個SERVICE卻正常提交了,USER被加入到了資料庫當中。

    先不改配置,我們改下SERVICE程式碼:

    public void addUser(USER user) throws Exception {
        userDaoImpl.saveUser(user);
        delByUsername(user.getName());
    }

    public void delByUsername(String name) throws Exception {
//        String s = null;
//        s.length();
        throw new RuntimeException("runtime e");
    }

    讓第二個SERVICE丟擲執行時異常,再測試,會發現這個時候第一個SERVICE的事務也回滾了,USER

沒有插入資料庫中。

    從測試中我們可以發現,在事務傳播為propagation="REQUIRED"的時候,如果SERVICE中丟擲檢查型

異常,其它的事務可以正常提交,但是如果SERVICE丟擲執行時異常,則所有的SERVICE共享同一事務。

    如果我們改下配置,如下:

<tx:method name="add*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
     這個時候,無論SERVICE裡丟擲執行時異常還是檢查型異常,將共享同一事務,也就是說只要有異常,事務

將自動回滾。

    現在只發現了這個問題,如果大家遇到什麼問題也可以提出來一起討論下。

相關推薦

springservice呼叫service事務控制

    在使用SPRING的事務控制時,事務一般都是加在SERVICE層的,這個時候如果一個SERVICE呼叫另一個 SERVICE時有可能會出現事務控制問題,比如第二個SERVICE丟擲了異常,第一個SERVICE卻正常提交了, 比如下面這個例子: 事務配置 <t

spring預設就能行,沒有就新建,有了就一起用一個事務service呼叫service),一方錯都回滾

@Transactional 註解是用來指定介面、類或方法必須擁有事務語義的元資料。 如:“當一個方法開始呼叫時就開啟一個新的只讀事務,並停止掉任何現存的事務”。 預設的 @Transactional 設定如下: 事務傳播設定是 PROPAGATION_REQUIRE

spring 事務管理——回滾之service層(事務控制層)程式碼互調

spring事務管理相關的文章已經有很多了,本人寫此文章主要為自己的實驗做一個記錄,年紀大了,記性不好 首先先貼幾個地址,有興趣研讀的同學可以參考一下: 初級使用: 初級容易犯的錯:事務中catch異常 官方介紹: 預設回滾配置實驗: 以上幾個地址是從不同的角度來

Spring的註解@Service @Component @Controller @Repository區別

@Service用於標註業務層元件,  在 serviceImpl 上註解 @Controller用於標註控制層元件(如struts中的action),  在handler/ mycontroler上註解 @Repository用於標註資料訪問元件,即DAO元件,  在d

關於controller呼叫controller/service呼叫service/util呼叫service/websocketautowired的解決方法

問題背景 這個問題,其實分為四個問題,思路是一致的。 controller呼叫controller service呼叫service util呼叫service websocket中autowired 呼叫實戰 例如我現在有個AppConfig,需要在Ema

SpringServlet注入service時無法@Autowired自動注入的問題解決

今天遇到了一個問題,就是Controller層自動注入service時,一直在報空指標異常,而使用getbean卻好好的,百思不得其解,終於得到了解決的方法。 10-Dec-2018 22:21:21.619 嚴重 [http-nio-8080-exec-5] org.apache.cata

service層@Transactional事務控制使用以及注意

@Service @Transactional public class CeshiService { @Autowired LoginFeignClient loginFeignClient; @Transactional(rollback

執行緒安全性以及Spring@Controller、@Service的使用

執行緒安全性定義 多個執行緒同時訪問一個類,不論執行時環境怎樣分配排程方法或者這些執行緒如何交替執行類中的方法,並且呼叫該類方法的多執行緒程式碼不進行同步或協同操作,在這種情況下,這個類表現出的行為都是正確一致的,則稱這個執行緒是安全的。 執行緒安全性體

spring boot集成mybatis+事務控制

package 數據源 action cti ase conn span hand enc 一下代碼為DEMO演示,采用註解的方式完成Spring boot和Mybatis的集成,並進行事物的控制 數據源的配置: 1 spring.datasource.url=jdbc:

Spring --16.Spring基於註解的宣告事務控制

1、建立子工程、引入依賴 (同上xml方式) 2、編寫相關類、(同上xml方式) 3、開啟Spring對註解的支援、配置事務管理、開啟Spring對註解的支援 applicationContext.xml <?xml version="1.0" encoding="UTF-

Spring結合jdbc以及mybatis事務控制

事務屬性包含的五個方面分別是什麼 1、事務傳播行為 規定了如果有新的事務應該被啟動還是被掛起,或者方法是否需要在事務中執行。 TransactionDefinition.PROPAGATION_REQUIRED如果當前存在事務,則加入該事務,如果當前沒有事務,則

spring與mybatis整合及事務控制

一. 簡介 本文將會使用spring整合mybatis, 並新增事務管理, 以此為記, 方便以後查閱。 二. 例子 1. 程式碼結構圖: 2. 建表語句: DROP DATABASE test; CREATE DATABASE test; USE test

Spring註解bean和事務?有哪些相關的註解?踩坑

<context:component-scanbase-package="org.example"/>然後可以用@Component、@Controller、@Service、@Repository註解來標註需要由Spring IoC容器進行物件託管的類。這幾個註

Oracle資料庫資料操作和事務控制以及鎖

表資料的操作(DML):     插入:     修改:     刪除:     合併:大資料操作的時候,資料倉庫      插入:使用values只能插入一行資料     插入空值:         1)不寫         2)插入空串         3)null

Spring的程式設計式事務與宣告式事務

程式設計式事務: 使用PlatformTransactionManager及TransactionTemplate ,其中PlatformTransactionManager可在xml檔案中配置 1.宣告資料來源 2.宣告一個事務管理類,例如:DataSourceTrans

Spring service本類方法呼叫另一個方法事務不生效問題

前些日子一朋友在需要在目標物件中進行自我呼叫,且需要實施相應的事務定義,且網上的一種通過BeanPostProcessor的解決方案是存在問題的。因此專門寫此篇帖子分析why。 1、預備知識 使用AOP 代理後的方法呼叫執行流程,如圖所示 也就是說我們首先呼叫的是

Spring不用注入如何正確呼叫service方法

spring問題總結 問題描述: 某種業務場景用到Java反射去確定呼叫哪個業務層 與呼叫哪個方法。但是利用傳統的反射機制會 脫離spring容器,dao層並沒有例項化,dao操作完全 執行不了 利用先獲取spring容器,再從spring中獲取bean的例項為正解: 程式

Spring專案普通工具類呼叫service介面

WebApplicationContext context = ContextLoader.getCurrentWebApplicationContext(); IControlService controlService= (IControlService) context

關於Spring初始化一個靜態變數(需要呼叫Service層然後從資料庫查出來的)

想要在專案啟動時初始化一些靜態變數(從資料庫裡查出來的)首先想到了使用 static{ } 靜態程式碼塊, 但是靜態程式碼塊的執行順序在 @Autowired注入的Service層之前。也就是說要在靜態程式碼塊中 訪問資料庫, 但是 執行靜態程式碼塊中的程式碼時, @Auto

spring quartz定時器呼叫service事務失效原因

專案中集成了activiti配置檔案遇到一個很詭異的問題,通過url方式呼叫controller,service層事務正常,但是spring quartz定時器呼叫service層時事務失效,經過反覆測試原因是:在activiti配置檔案中又重複配置了transactionM