Spring_8-Spring事务管理

Posted TheSkyCloud

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring_8-Spring事务管理相关的知识,希望对你有一定的参考价值。

Spring事务管理

事务操作:

1 事务添加到JavaEE三层结构里面的Service层(业务逻辑层)

2 事务管理操作的两种方式

1)编程式事务管理

2)声明式事务管理(一般都使用)


3 声明式事务管理

1)基于注解方式

2)基于xml配置文件方法


4 在Spring进行声明式事务管理,底层使用AOP原理


5 Spring事务管理ApI

提供一个接口,代表事务管理器,这个接口针对不同的框架提供不同的实现类


事务操作(注解声明式事务管理):


1 在spring配置文件中配置事务管理器

 <!--创建事务管理器-->

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

        <!--注入数据源-->

        <property name="dataSource" ref="dataSource"></property>

    </bean>


2 在spring配置文件中,开启事务注解

1)在spring配置文件中引入名称空间tx

<beans xmlns="http://www.springframework.org/schema/beans"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xmlns:context="http://www.springframework.org/schema/context"

       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/context https://www.springframework.org/schema/context/spring-context.xsd

       http://www.springframework.org/schema/tx https://www.springframework.org/schema/tx/spring-tx.xsd">


2)开启事务注解

<!--开启事务注解-->

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


3 在service类上面(或者service类里面的方法上面)添加事务注解:

@Transactional

public class UserService {


}


声明式事务管理参数配置:

1 在service类上面添加注解@Transaction,在这个注解里面可以配置事务相关参数


propagation: 事务传播行为

多事务方法直接进行调用,这个过程中事务时如何进行管理的

事务方法:对数据库表数据进行变化的操作

七种事务传播行为:

REQUIRED 如果有事务在运行,当前的方法就在这个事务内运行,否则启动一个新的事务,并在自己的事务内运行

REQUIRED_NEW 当前的方法必须启动新事物,并在它自己的事务内运行,有事务在运行就挂起

@Service

@Transactional(propagation = Propagation.REQUIRED)

public class UserService {

}

isolation: 事务隔离级别

事务有特性成为隔离性,多事务操作之间不会产生影响,不考虑隔离性缠身很多问题

三个读问题:脏读,不可重复读,幻读

脏读:一个未提交事务读取到另一个未提交事务的数据

不可重复读:一个未提交事务读到另一提交事务修改数据

幻读:一个未提交事务读到另一个提交事务添加数据


通过设置事务隔离性,解决读问题

@Service

@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.REPEATABLE_READ)

public class UserService {

}


timeout: 超时时间

事务需要在一定时间内进行提交,不提交就回滚

默认值-1,设置时间以秒为单位进行计算


readOnly:是否可读

读,查询操作;写,添加修改删除操作

readOnly默认值false,表示可以查询,可以添加删除修改操作

设置为true,只能查询


rollbackFor:回滚

设置异常回滚


noRollbackFor:不会滚

设置异常不进行回滚


xml声明式事务管理:

在spring配置文件中进行配置

1 配置事务管理器

2 配置通知

3 配置切入点,切面

<beans xmlns="http://www.springframework.org/schema/beans"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xmlns:context="http://www.springframework.org/schema/context"

       xmlns:aop="http://www.springframework.org/schema/aop"

  xmlns:aop="http://www.springframework.org/schema/aop"

 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

                        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd

                        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd

                        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">


<!-- 组件扫描 -->

    <context:component-scan base-package="com.atguigu"></context:component-scan>


    <!-- 数据库连接池 -->

    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"

          destroy-method="close">

        <property name="url" value="jdbc:mysql:///user_db" />

        <property name="username" value="root" />

        <property name="password" value="root" />

        <property name="driverClassName" value="com.mysql.jdbc.Driver" />

    </bean>


    <!-- JdbcTemplate对象 -->

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">

        <!--注入dataSource-->

        <property name="dataSource" ref="dataSource"></property>

    </bean>


    <!--1 创建事务管理器-->

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

        <!--注入数据源-->

        <property name="dataSource" ref="dataSource"></property>

    </bean>


    <!--2 配置通知-->

    <tx:advice id="txadvice">

        <!--配置事务参数-->

        <tx:attributes>

            <!--指定哪种规则的方法上面添加事务-->

            <tx:method name="accountMoney" propagation="REQUIRED"/>

       

        </tx:attributes>

    </tx:advice>


    <!--3 配置切入点和切面-->

    <aop:config>

        <!--配置切入点-->

        <aop:pointcut id="pt" expression="execution(* com.atguigu.spring5.service.UserService.*(..))"/>

        <!--配置切面-->

        <aop:advisor advice-ref="txadvice" pointcut-ref="pt"/>

    </aop:config>


完全注解开发:

1 创建配置类,使用配置类代替xml配置文件

@Configuration //配置类

@ComponentScan(basePackages = "com.atguigu") //组件扫描

@EnableTransactionManagement //开启事务


TxConfig 类:

public class TxConfig {


    //创建数据库连接池

    @Bean

    public DruidDataSource getDruidDataSource() {

        DruidDataSource dataSource = new DruidDataSource();

        dataSource.setDriverClassName("com.mysql.jdbc.Driver");

        dataSource.setUrl("jdbc:mysql:///user_db");

        dataSource.setUsername("root");

        dataSource.setPassword("root");

        return dataSource;

    }


    //创建JdbcTemplate对象

    @Bean

    public JdbcTemplate getJdbcTemplate(DataSource dataSource) {

        //到ioc容器中根据类型找到dataSource

        JdbcTemplate jdbcTemplate = new JdbcTemplate();

        //注入dataSource

        jdbcTemplate.setDataSource(dataSource);

        return jdbcTemplate;

    }


    //创建事务管理器

    @Bean

    public DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource) {

        DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();

        transactionManager.setDataSource(dataSource);

        return transactionManager;

    }

}


以上是关于Spring_8-Spring事务管理的主要内容,如果未能解决你的问题,请参考以下文章

8.Spring整合Hibernate_2_声明式的事务管理(Annotation的方式)

8 -- 深入使用Spring -- 6... Spring的事务

Spring学习8-Spring事务管理(编程式事务管理)

spring的学习____8 spring_AoP的实现方式一:使用spring API实现

Spring学习8-Spring事务管理(AOP/声明式式事务管理)

Spring是怎么通过AOP实现事物管理的,它支持哪几种事务隔离类型;