1. 程式人生 > >Spring多資料來源事務處理機制

Spring多資料來源事務處理機制

最近有spring配置多資料來源,中間用了aop來完成動態的切換,發現一些地方不是很明白,在AbstractRoutingDataSource這個類中有determineCurrentLookupKey的方法,另外我在所有DAO層方法上添加了before的切面,按理說,如果呼叫了某一個DAO層的方法,應該是先呼叫切面的方法,然後再呼叫determineCurrentLookupKey方法,最後才是DAO層的方法,可是我除錯的結果是determineCurrentLookupKey方法,其次切面,最後DAO,不是很理解AbstractRoutingDataSource的呼叫過程。

原因:當在service層呼叫dao層進行資料庫處理時,若service 沒有啟動事務機制,則執行的順序為:切面——>

determineCurrentLookupKey——>Dao方法。而當在service層啟動事務時,由於在一個事務中執行失敗後會回滾之前所執行的所有操作,因此spring會在service方法執行前呼叫determineCurrentLookupKey,此時無聊service中有多少個dao呼叫determineCurrentLookupKey將不再執行,即在事務中不支援資料來源切換。

如:

@Transactional(propagation = Propagation.REQUIRED) //順序為:切面——>determineCurrentLookupKey——>Dao方法


public String getJsonList(PageBean page,Map<String,String> map,String className,String order){
List<T> list=new ArrayList<T>();
if(order.equals("null"))
list=getList(page,map,className);
else
list=getList(page,map,className,order);
int rowCount = dao.getCount("select count(*) from "+className+Utils.getHql(map));
HashMap<String, Object> tempMap = new HashMap<String, Object>();
tempMap.put("Rows", list);
tempMap.put("Total", rowCount);
JSONObject json = new JSONObject();
json.putAll(tempMap);
return json.toString();
}

@Transactional(propagation = Propagation.SUPPORTS)//順序為:determineCurrentLookupKey——>切面——>Dao方法
public String getJsonList(PageBean page,Map<String,String> map,String className,String order){
List<T> list=new ArrayList<T>();
if(order.equals("null"))
list=getList(page,map,className);
else
list=getList(page,map,className,order);
int rowCount = dao.getCount("select count(*) from "+className+Utils.getHql(map));
HashMap<String, Object> tempMap = new HashMap<String, Object>();
tempMap.put("Rows", list);
tempMap.put("Total", rowCount);
JSONObject json = new JSONObject();
json.putAll(tempMap);
return json.toString();
}

相關推薦

Spring資料來源事務處理機制

最近有spring配置多資料來源,中間用了aop來完成動態的切換,發現一些地方不是很明白,在AbstractRoutingDataSource這個類中有determineCurrentLookupKey的方法,另外我在所有DAO層方法上添加了before的切面,按理說,如果

Spring 資料來源事務配置問題

在SpringSide 3 中,白衣提供的預先配置好的環境非常有利於使用者進行快速開發,但是同時也會為擴充套件帶來一些困難。最直接的例子就是關於在專案中使用多個數據源的問題,似乎 很難搞。在上一篇中,我探討了SpringSide 3 中的資料訪問層,在這一篇中,我立志要解決多

Spring Boot2.0之資料來源事務管理

結合前面做的小專案,如果我把test01 test02下面的 service 都加了 事務的註解 這樣啟動時候會報錯! 事務管理器裡面不能有兩個事務!!!! 這時候需要用  @Transactional(transactionManager="test1TransactionManager")

Spring+Mybatis+Atomikos資料來源事務一致性

1、背景 由於應用多資料來源的寫操作,一定會涉及到資料的一致性問題,由於mybatis-plus 的侷限性,採用spring+mybatis+atomikos+druid實現分散式事務一致性。 2、實現 pom.xml <?xml version="1.0" encoding="

Spring Boot資料來源事務管理

在開發企業應用時,對於使用者的一個操作實際上對應底層資料庫的多個讀寫。由於資料操作在順序執行的過程中,任何一步操作都有可能發生異常,異常會導致後續操作無法完成,此時由於業務邏輯並未正確的完成,之前成功操作資料的並不可靠,會產生不一致的資料,需要在這種情況下進行回退。事務的作用

Spring 資料來源 @Transactional 註解事務管理

在 Spring,MyBatis 下兩個資料來源,通過 @Transactional 註解 配置簡單的事務管理 spring-mybatis.xml <!--******************************** data one start *********

spring boot學習6之mybatis+PageHelper分頁外掛+jta資料來源事務整合

        在專案開發中,隨著業務的擴充套件,api可能會操作多個數據庫。本博文就學習下spring boot下使用spring-boot-starter-jta-atomikos對mybatis+mysql+PageHelper分頁外掛的整合。   專案檔案結構

Spring事務處理機制

常用的事務處理方式:   手動處理事務   註解式事務   AOP宣告事務資料庫訪問時,就不需要開啟Session、開啟事務,提交事務、關閉 Session。由AOP指定的事務管理器,在方法(資料庫訪

spring JTA資料來源事務管理詳細教程

<context:annotation-config /> <!-- 使用註解的包路徑 --> <context:component-scan base-package="com.rongli.service,com.rongli.dao,com.rongli.

spring + mybatis 資料來源事務

1.配置Druid資料庫資料來源 <bean id="master_dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"> <!-- 資料

spring資料來源動態切換及事務

原文地址:http://blog.csdn.net/liuxiao723846/article/details/43526549 1、使用了spring的aop思想,實現了動態資料來源的切換。 2、spring的事務管理,是基於資料來源的,所以如果要實現動態資料來源切換,而且在同一個資料來源中保證事

spring boot資料來源配置,資料來源事務

springboot目錄 需求描述 在業務開發中,需要讀寫分離,或者需要配置多個數據源,接下來我們看看在springboot中如何配置多資料來源,支援事務。 想知道springboot如何載入配置以及選擇使用哪個連線池,請移步 app

spring資料來源的配置(分散式事務管理)

<bean id="dataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close"> <property name="uniqueResource

spring 資料來源手動管理事務,最大程度保障資料一致性

模板程式碼如下: @Autowired private DataSourceTransactionManager transactionManager; public void

原始碼分析 spring事務處理機制

Spring在TransactionDefinition介面中定義這些屬性,以供PlatfromTransactionManager使用, PlatfromTransactionManager是Spring事務管理的核心介面。介面程式碼如下: public interface

spring資料來源配置 簡單明瞭

來源地址https://blog.csdn.net/ll535299/article/details/78203634   1.首先在config.properties檔案中配置兩個資料庫連線的基本資料。這個省略了  2.在spring配置檔案中配置這兩個資料來源:&nb

Spring事務控制--Spring中的事務處理

事務回顧 1)什麼是事務? 事務是邏輯上的一組操作,組成這組操作的各個邏輯單元,要麼一起成功,要麼一起失敗。 2)事務的特性(ACID) 原子性(Atomicity):事務是一個原子操作,由一系列動作組成。事務的原子性確保動作要麼全部完成,要麼完全不起作用。

實現資料來源事務

最近在重構專案中,需要相容多資料來源,故此實現下多資料來源事務。 這次重構專案中,為了支援後續龐大的資料量接入,更迭了資料庫,但是為了要相容老版本,也不能直接拿掉老的資料庫。所以就有了相容多資料來源的需求,尤其是要保證事務。 其實這個需求就是要實現分散式事務,但是我們的這個場景是在一個服務內,所

springboot 動態資料來源事務

由於近期專案要對資料庫進行劃分成多個數據庫,從當一的資料庫,根據業務進行劃分多個數據庫,所以使用動態路由+aop來實現資料庫的動態切換,當是其中有一個重要的問題,就是事務要怎麼解決,比如在一個service中對其他業務資料庫進行查詢,修改,新增,會出現資料來源不會進行切換的問

springboot+mybaits-plus 資料來源+事務操作(親測有效)

乾貨 配置檔案 @Configuration @MapperScan({ "com.cn.springboot.*.mapper**"}) public class DynamicDataSourceConfig {     /**      * 在方法上註解c