申明式事务工作详解版权声明

原创
小哥 3年前 (2022-11-11) 阅读数 87 #大杂烩

spring有两种类型的交易:

1,编程事务:控制程序中的事务启动、执行和提交;(不推荐,所以我不会在这里解释太多)

2,声明性事务:中。Spring在配置文件中配置事务,而不在程序中写入代码;(推荐)

我对“陈述性”的理解是:Spring这样的规则在配置文件中定义,

该规则可以指定在执行时添加事务控制的类和方法,

当这些类的这些方法被执行时,隐式添加事务以启动、执行、提交或回滚的代码(当然我们看不到)

声明性事务以两种不同的方式编写:

2.1、xml配置文件

2.2、注解

让我们首先解释以下内容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:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">










    
    
    
    
    
    
    
    
    
    



    
    
        
            true
            true
            org.hibernate.dialect.MySQL5Dialect
            false
            update
        
    
    
        
            news/entity/News.hbm.xml
        
    



     
     
 
     

     
         
         
         
         
     
 

 
 
     
     
     
 

我相信这段代码对于我们这些初学者来说并不容易理解,让我来给你分析一下:

1,创建事务管理器

2,配置通知

属性

必须

默认值

描述

name

要切入的方法的名称,可以使用通配符。

propagation

不是

REQUIRED

事务通信行为

isolation

不是

DEFAULT

事务隔离级别

timeout

不是

-1

事务超时时间(秒)

read-only

不是

false

事务是只读的吗?

rollback-for

不是

将触发回滚。 Exception(s) ; 用逗号分隔。 如: news.serviceImpl

no-rollback-for

不是

已触发回滚 Exception(s) ; 用逗号分隔。 如: news.serviceImpl

3、配置切线表达式, 并且让 tx与切线表达式组合

让我解释一下execution( news.service..*(..))"中几个通配符的含义:

第一个 —— 通配 任何返回值类型 第二个 —— 通配 包news.service下的任意class 第三个 * —— 通配 包news.service下的任意class任何方法 第四个 .. —— 通配 方法可以具有0一个或多个参数

综上:包news.service下的任意class的具有任何返回值类型、任意数目参数和任意名称的方法

做到这里xml该方法的事务管理基本完成,最后一步是导入其相关的缺失包(必须导入这些包才能进行任何形式的事务管理)

如果你没有这些包,你可以去网站下载: http://pan.baidu.com/s/1eSlyY1G

最后,让我们讨论注释形式的声明性事务管理。

注释形式的声明性事务管理,只要applicationContext.xml在此文档中添加一句话

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

您可以从上面的代码中放入以下字符串。xml去掉了,

配置切线表达式, 并且让 tx与切线表达式组合 表达式, 定义哪个包的哪些类需要切入事务,但是这里没有开发类中的哪些方法。,需要什么样的切入点 事务 ![](https://www.itfans123.com/wp-content/uploads/2022/11/post-4511-636dd23b9a2ee.gif) 有人会问,如何实现交易管理? 这很简单,它不如将事务管理添加到类中的所有方法,所以您可以直接将一个添加到该类中。@Transactional评论很好 如果您只希望一个方法加入事务管理,也可以将其直接添加到一个方法中。@Transactional注解 当然,此注释中也有一些常用的属性。 **参数名称** **功能描述** **readOnly** 此属性用于设置当前事务是否为只读事务,设置true表示只读,false表示读取和写入,具有默认值false。例如:@Transactional(readOnly=true) **rollbackFor** 此属性用于设置需要回滚的异常类数组。当方法中抛出指定异常数组中的异常时,事务将回滚。例如: 指定单个异常类:@Transactional(rollbackFor=RuntimeException.class) 指定多个异常类:@Transactional(rollbackFor={RuntimeException.class, Exception.class}) **rollbackForClassName** 此属性用于设置需要回滚的异常类名数组。当方法中抛出指定异常名称数组中的异常时,事务将回滚。例如: 指定单个异常类名:@Transactional(rollbackForClassName="RuntimeException") 指定多个异常类名:@Transactional(rollbackForClassName={"RuntimeException","Exception"}) **noRollbackFor** 此属性用于设置不需要回滚的异常类数组。当在方法中抛出指定异常数组中的异常时,不会执行事务回滚。例如: 指定单个异常类:@Transactional(noRollbackFor=RuntimeException.class) 指定多个异常类:@Transactional(noRollbackFor={RuntimeException.class, Exception.class}) **noRollbackForClassName** 此属性用于设置不需要回滚的异常类名数组。当在方法中抛出指定异常名称数组中的异常时,不会执行事务回滚。例如: 指定单个异常类名:@Transactional(noRollbackForClassName="RuntimeException") 指定多个异常类名: @Transactional(noRollbackForClassName={"RuntimeException","Exception"}) **propagation** 此属性用于设置事务的传播行为。有关具体值,请参考以下内容 例如:@Transactional(propagation=Propagation.NOT\_SUPPORTED,readOnly=true) **isolation** 此属性用于设置基础数据库的事务隔离级别。事务隔离级别用于处理多个事务的并发情况。通常使用数据库的默认隔离级别,基本上不需要设置。 **timeout** 此属性用于使用默认值设置事务的超时秒数-1意味着永不超时 **介绍事物传播的行为。:** @Transactional(propagation=Propagation.REQUIRED) :如果存在交易, 然后加入交易, 如果没有,请创建一个新的(默认情况下) @Transactional(propagation=Propagation.NOT\_SUPPORTED) :容器未为此方法打开事务。 @Transactional(propagation=Propagation.REQUIRES\_NEW) :交易是否存在,创建新事务。,原始挂起,新执行已完成,继续执行旧业务。 @Transactional(propagation=Propagation.MANDATORY) :必须在现有事务中执行。,否则,将引发异常。 @Transactional(propagation=Propagation.NEVER) :必须在没有,否则,将引发异常。(与Propagation.MANDATORY相反) @Transactional(propagation=Propagation.SUPPORTS) :如果其他bean调用此方法,在其他bean在中声明事务,然后使用事务.如果其他bean无申报交易, 注意: 在这种情况下spring交易管理: ● private 方法无法添加事务管理. ● final 方法无法添加事务管理. ● static 方法无法添加事务管理. ● 绕过代理对象时, 当直接调用添加事务管理的方法时。, 交易管理将无效. 原始地址: [https://www.cnblogs.com/LarryBlogger/p/5969943.html](https://www.cnblogs.com/LarryBlogger/p/5969943.html)
版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除