首页 > 其他分享 >Spring_声明式事务

Spring_声明式事务

时间:2023-03-01 13:12:16浏览次数:50  
标签:事务 异常 Spring 脏读 如果 声明 取值 属性

编程式事务:

  由程序员编写事务控制代码,例如:OpenSessionInView。

声明式事务:

  由框架提供的,程序员只需要声明出哪些方法要进行事务控制和如何进行事务控制。

 

 


一、配置

1、准备要进行事务管理的数据库对象

    <!--DataSource对象-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost:53306/lurenjia_web"></property>
        <property name="username" value="root"></property>
        <property name="password" value="123456"></property>
    </bean>

2、声明一个事务管理器

    <!--事务管理器-->
    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!--需要一个DataSource对象来知道对哪个数据库进行关联,可以使用自动注入-->
        <property name="dataSource" ref="dataSource"></property>
    </bean>

3、配置声明式事务

    <!--配置声明式事务-->
    <tx:advice id="txAdvice" transaction-manager="txManager">
        <!--具体哪些方法需要有事务控制-->
        <tx:attributes>
            <!--REQUIRED:默认事务传播行为-->
            <tx:method name="ins*" propagation="REQUIRED"/>
            <tx:method name="del*"/>
            <tx:method name="upd*"/>
            <tx:method name="*" read-only="true"/>
        </tx:attributes>
    </tx:advice>
    <!--声明式事务是基于aop实现的,所以需要配置aop-->
    <aop:config>
        <!--配置切点范围,需要包括需要有事务控制的方法-->
        <aop:pointcut id="point_tx" expression="execution(* com.lurenjia.service.impl.*.*(..))"/>
        <!--事务通知配置-->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="point_tx"></aop:advisor>
    </aop:config>

二、属性说明

(一)、propagation属性(事务传播行为)

  控制事务传播行为,即多个含有事务控制的方法之间相互调用的时候,对于事务关系的设置。

取值:

  required(默认值),如果当前有事务,则在事务中执行,如果没有,则创建一个。

  supports,如果当前有事务,则在事务中执行,如果没有,则在非事务状态下执行。

  mandatory,如果当前有事务,则在事务中执行,如果没有,则报错。

  requires_new,如果当前没有事务,则创建一个事务,如果有,则把当前事务挂起。(必须在自己的事务中执行)

  not_supported,如果当前没有事务,则正常执行,如果有,则把事务挂起。(必须在非事务中执行)

  never,如果当前没有事务,则正常执行,如果有,则报错。

  nested,如果当前没有事务,则创建一个事务,如果有事务,则创建一个嵌套事务。

(二)、read-only属性

  设置方法是否为只读事务。

取值:

  true,告知数据库此事务为只读事务,则不会对此事务加锁,则效率高。(查询)

  false(默认),非只读事务,需要提交的事务。(增删改)

(三)、isolation属性(隔离级别)

  设置事务的隔离级别,主要用于解决:脏读、不可重复读、幻读

取值:

  default,默认值,由数据库自动判断使用什么隔离级别

  read_uncommitted,可以读取到其他事务未提交的数据。(会出现脏读、不可重复读、幻读,效率高)

  read_committed,只能读取到其他事务已经提交了的数据。(可以避免脏读)

  repeatable_read,读取的数据会被加锁,其它事务不可修改(可以避免脏读,不可重复读)

  serializable,对读取的表添加锁,其它事务不可操作。(不会出现脏读、不可重复读、幻读,效率低)

(四)、rollback-for属性(异常回滚)

  设置出现什么异常的时候发生回滚

取值:

  异常类的全限定路径(包名.类名)

问题:

  虽然默认值为java.lang.Exception,但是可能出现手动抛出异常不回滚的情况(throws new Exception())。

解决:

  给点此属性值。

(五)、no-rollback-for属性(异常不回滚)

  设置出现什么异常的时候事务不发生回滚

取值:

  异常类的全限定路径(包名.类名)

使用场景:

  抛出异常是为了阻止程序继续运行,类似于return。

标签:事务,异常,Spring,脏读,如果,声明,取值,属性
From: https://www.cnblogs.com/lurenjia-bky/p/17167783.html

相关文章

  • SpringBoot Actuator RCE 漏洞总结
    一、SpringBootenv获取*敏感信息 当我们直接访问springboot站点时,可以看到某些password字段填充了*通过${name}可以获取明文字段  2.配置不当导致敏感信息......
  • Spring中最常用的11个扩展点
    以下文章来源于苏三说技术,作者苏三呀https://mp.weixin.qq.com/s?__biz=MzI1NDQ3MjQxNA==&mid=2247504879&idx=1&sn=23867ba5bf39595548c554bbf7eb2230&chksm=e9c62a5ede......
  • springboot 自动装配之@ConditionalOnClass,@ConditionalOnMissingClass
    @ConditionalOnClass表示如果有后面的类,那么就加载这个自动配置@ConditionalOnMissingClass如果没有后面的类,才自动配置这2个注解对实现自动配置很重要。@Configuration......
  • React:已声明“XXXX”,但是从未读取其值
    React:已声明“XXXX”,但是从未读取其值。引入组件后,还需要在DOM中引用如果使用了该组件,但还是提示未读取其值这里需要注意:React不像Vue,组件标签首字母必须大写......
  • 微服务Spring Cloud Alibaba简单笔记
    NacosNacos体系架构领域模型Nacos领域模型描述了服务与实例之间的边界和层级关系。Nacos的服务领域模型是以“服务”为维度构建起来的,这个服务并不是指集群中的单个......
  • springcloud之nacos(一)安装
    一、首先下载nacos:https://github.com/alibaba/nacos/releases二、打开修改conf文件夹下的配置文件新建一个数据库nacos_dev,执行nacos-mysql.sql  执行完后,可以看......
  • MySQL的RR和RC事务隔离级别加锁类型验证
    先上结轮:MySQL5.7数据库Innodb引擎在默认的REPEATABLE-READ(RR)事务隔离级别时,事务更新操作对于where条件锁定的范围加的是Next-KeyLock即临键间隙锁,对于确切条件......
  • Spring IOC官方文档学习笔记(十三)之环境概要
    1.profiles(1)profiles提供了一种在不同环境(Environment)下注册不同的bean的机制,如下//假定现在我们存在开发和生产两个环境,每种环境下ExampleA所需的url都是不同的,......
  • spring整合web
    在service层开启的时候创建spring容器,在listener初始化的时候获取,然后将spring容器存储到servletContext中创建listener,重写里面的初始化方法contextInitializedpackage......
  • 【SpringCloud】feign.codec.EncodeException: No qualifying bean of type
    错误描述在SpringCloud项目中通过OpenFeign远程调用时出现如下错误:feign.codec.EncodeException:Noqualifyingbeanoftype'org.springframework.boot.autocon......