1. 程式人生 > >springboot xml宣告式事務管理方案

springboot xml宣告式事務管理方案

開發十年,就只剩下這套架構體系了! >>>   

在開發過程中springboot提供的常見的事務解決方案是使用註解方式實現。

使用註解

在啟動類上添加註解

@EnableTransactionManagement

在需要事務控制的方法新增@Transactional註解

這種方式問題是,我們需要在方法上添加註解,這樣處理起來特別麻煩。

我們可以使用XML方式配置,配置好後,方法不需要加註解,這樣我們使用起來就不需要再管註解的事情。

1.新增transaction.xml 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop.xsd">

    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="query*" propagation="SUPPORTS" read-only="true"></tx:method>
            <tx:method name="get*" propagation="SUPPORTS" read-only="true"></tx:method>
            <tx:method name="select*" propagation="SUPPORTS" read-only="true"></tx:method>
            <tx:method name="*" propagation="REQUIRED" rollback-for="Exception"></tx:method>
        </tx:attributes>
    </tx:advice>
    <aop:config>
    <aop:pointcut id="allManagerMethod"
                  expression="execution (* com.neo.service.*.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod" order="0"/>
    </aop:config>

    <tx:annotation-driven transaction-manager="transactionManager" />
</beans>

 

這樣我們只需只要在編寫事務程式碼的時候遵循上面的規則,編寫方法名稱,就可以對事務進行攔截。

2.在啟動類上引入此配置檔案。

@SpringBootApplication
@ImportResource("classpath:transaction.xml")
@MapperScan({"com.neo.dao"}) 
public class DemoApplication {

這樣springboot 就可以支援事務管理了。

3.測試事務是否生效

public void create(SaleOrder order){
    orderDao.create(order);
    throw new RuntimeException("出錯了") ;
}

編寫程式碼如下,在新增後丟擲異常,發現數據並沒有真正的插入。

 

注意事項:

使用事務需要引入:

<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>fastjson</artifactId>
   <version>1.2.46</version>
</dependency>

列印事務日誌:

logging:
  level:
     com.neo.dao: debug
     org.springframework.jdbc: debug

日誌執行情況:

2018-10-16 23:17:17.702 DEBUG 9640 --- [nio-8000-exec-1] o.s.j.d.DataSourceTransactionManager     : Creating new transaction with name [com.neo.service.SaleOrderService.create]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,-Exception
2018-10-16 23:17:17.708 DEBUG 9640 --- [nio-8000-exec-1] o.s.j.d.DataSourceTransactionManager     : Acquired Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@7f9c9817] for JDBC transaction
2018-10-16 23:17:17.713 DEBUG 9640 --- [nio-8000-exec-1] o.s.j.d.DataSourceTransactionManager     : Switching JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@7f9c9817] to manual commit
2018-10-16 23:17:17.754 DEBUG 9640 --- [nio-8000-exec-1] com.neo.dao.SaleOrderDao.create          : ==>  Preparing: INSERT INTO SALE_ORDER (ID_,NAME_,TOTAL_,CREATOR_,CREATE_TIME_) VALUES (?, ?, ?, ?, ?) 
2018-10-16 23:17:17.782 DEBUG 9640 --- [nio-8000-exec-1] com.neo.dao.SaleOrderDao.create          : ==> Parameters: 1539703037695(String), zyg(String), 33.0(Double), AA(String), null
2018-10-16 23:17:17.784 DEBUG 9640 --- [nio-8000-exec-1] com.neo.dao.SaleOrderDao.create          : <==    Updates: 1
2018-10-16 23:17:17.785 DEBUG 9640 --- [nio-8000-exec-1] o.s.j.d.DataSourceTransactionManager     : Initiating transaction rollback
2018-10-16 23:17:17.785 DEBUG 9640 --- [nio-8000-exec-1] o.s.j.d.DataSourceTransactionManager     : Rolling back JDBC transaction on Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@7f9c9817]
2018-10-16 23:17:17.786 DEBUG 9640 --- [nio-8000-exec-1] o.s.j.d.DataSourceTransactionManager     : Releasing JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@7f9c9817] after transaction
2018-10-16 23:17:17.787 DEBUG 9640 --- [nio-8000-exec-1] o.s.jdbc.datasource.DataSourceUtils      : Returning JDBC Connection to DataSource
2018-10-16 23:17:17.797 ERROR 9640 --- [nio-8000-exec-1] o.a.c.c.C.[.[.[.[dispatcherServlet]      : Servlet.service() for servlet [dispatcherServlet] in context with path [/demo] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: 出錯了] with root cause

 

也可以單獨增加springboot的配置類,來使xml配置在springboot專案的生效

相關推薦

springboot xml宣告事務管理方案

開發十年,就只剩下這套架構體系了! >>>   

宣告事務管理二:基於AspectJ的xml配置

下面講述的是宣告式事務管理的第二種方法,是基於AspectJ的xml配置的       (1) 引入AspectJ的java包(一種簡化的操作)並copy到web-INF       (2) 配置事務管理器   &n

第十一講:11.spring宣告事務管理-xml方式

1,複製專案spring404 ,改名spring404-2,修改BankServiceImpl類,刪除宣告式事務的程式碼。宣告式事務管理的方式缺點是,事務程式碼嚴重嵌入邏輯程式碼中 package com.cruise.service.impl; import org.springframewor

spring宣告事務管理方式( 基於tx和aop名字空間的xml配置[email&#

轉自:https://www.cnblogs.com/niceyoo/p/8732891.html 1. 宣告式事務管理分類 宣告式事務管理也有兩種常用的方式, 一種是基於tx和aop名字空間的xml配置檔案,另一種就是基於@Transactional註解。 顯然基於註解的方式更簡單

spring事務管理之三:宣告事務管理:使用xml配置檔案的方式

這種方式是開發中常見的一種方式:利用aop的思想,將需要事務管理的業務方法通過xml配置的方式,將事務管理加在該類的相關方法上。這種方法的優點是,一次xml配置,後期不用關心業務類增加或者減少,通過xml中配置的匹配資訊,會去找業務類所在的包和方法,然後加上事務。 重點是配置<tx:a

Spring宣告事務管理事務的傳播行為xml配置

 1. <tx:method name="insert*" propagation="REQUIRED" />中name的值是ServiceImpl中各個要加入事物管理的方法的方法名。 <!-- 事務管理: Spring宣告式事務管理 。

宣告事務管理方式:基於AspectJ的XML方式和基於註解的方式

基於AspectJ的XML方式 <!-- 配置事務管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataS

xml方式實現spring的宣告事務管理及對jdbc操作的支援

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-

spring事物管理宣告事務管理xml配置

spring宣告式事務管理:xml配置如下 <!--  ================== 事務管理 ================== -->     <bean name="transactionManager"         class="or

Spring不同事務管理方式與宣告事務管理區域性回滾處理方案

Spring配置檔案中關於事務配置總是由三個組成部分,分別是DataSource、TransactionManager和代理機制這三部分,無論哪種配置方式,一般變化的只是代理機制這部分。  DataSource、TransactionManager這兩部分只是會根據資料訪問

宣告事務管理三:基於註解的配置

這種基於註解配置的宣告式事務管理方法式很簡單,很方便              (1) 像之前一樣恢復到初始狀態 (2) 配置事務管理器(注入連線池)       (3) 開啟註解

宣告事務管理一:TransactionProxyFactoryBean

     下面是宣告式事務管理的第一種方法使用原始的TransactionProxyFactoryBean,這種方法以後用的比較少,因為當事務管理比較複雜之後,相應的配置也會變得很複雜           

第十二講:12,spring宣告事務管理-註解

1,複製專案spring404 ,改名spring404-3。修改BankServiceImpl類,添加註解,package com.cruise.service.impl;import org.springframework.transaction.annotation.Tra

springboot(三) springboot開啟宣告事務

版權宣告:本文為博主原創文章,歡迎轉載,轉載請註明作者、原文超連結 ,博主地址:http://blog.csdn.net/forezp。 https://blog.csdn.net/forezp/article/details/70833629 轉載請標明出處: http://blog.csdn.n

Java程式設計師從笨鳥到菜鳥之(八十)細談Spring(九)spring+hibernate宣告事務管理詳解

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

淺談spring事務管理的2種方式:程式設計事務管理宣告事務管理;以及@Transactional(rollbackFor=Exception.class)註解用法

事務的概念,以及特性: 百度百科介紹: ->資料庫事務(Database Transaction) ,是指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。 事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向資料的資源。通過

使用註解實現Spring的宣告事務管理

使用註解實現Spring的宣告式事務管理,更加簡單! 步驟:          1) 必須引入Aop相關的jar檔案          2) b

spring事物配置,宣告事務管理和基於@Transactional註解的使用

spring支援程式設計式事務管理和宣告式事務管理兩種方式。         程式設計式事務管理使用TransactionTemplate或者直接使用底層的PlatformTransactionManager。對於程式設計式事務管理,spring推薦使用Transactio

9.spring:事務管理(下):宣告事務管理

宣告式事務管理  sprin的宣告式事務是管理AOP技術實現的事務管理,其本質是是對方法前後進行攔截,然後 在目標方法開始之前建立或者加入一個事務,在執行完成目標方法之後根據執行情況提交或者回滾事務。   宣告式事務管理優點:不需要通過程式設計的方式管理事務,因而不需要在業務邏輯程

springboot開啟宣告事務

springboot開啟宣告式事務 轉載http://blog.csdn.net/forezp/article/details/70833629   springboot開啟事務很簡單,只需要一個註解@Transactional 就可以了。因為在springboot中已經預設對jp