zoukankan      html  css  js  c++  java
  • Spring 事物操作

    事物操作(事务概念)

    1. 什么是事务

      1)事务是数据库操作最基本单元,逻辑上的一组操作,要么都成功,如果有一个失败所有操作都失败。

      2)典型场景:银行转账

      *lucy转账100元给marry

      *lucy少100,mary多100

    2. 事物四大特性(ACID):

      1)原子性

      2)一致性

      3)隔离性

      4)持久性

    事务操作(搭建事务操作环境)

    Snipaste_2020-10-22_20-59-37

    1. 创建数据库表,添加记录。

      Snipaste_2020-10-22_21-15-33

      <?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:context="http://www.springframework.org/schema/context"
             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
      ">
      
          <context:component-scan base-package="com.spring.transaction"></context:component-scan>
      
          <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
              <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
              <property name="url" value="jdbc:mysql://localhost:3306/count"></property>
              <property name="username" value="root"></property>
              <property name="password" value="root"></property>
          </bean>
      
          <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
              <property name="dataSource" ref="dataSource"></property>
          </bean>
      </beans>
      
    2. 创建service,搭建dao,完成对象创建和注入关系

      1)service注入dao,在dao注入JdbcTemplate注入DataSource

      @Autowired
      private JdbcTemplate jdbcTemplate;
      
      @Autowired
      private UserDao userDao;
      
    3. 在dao创建两个方法:多钱和少钱方法,在service创建转账方法

      public void countMoney(){
          userDao.reduceMoney();
          userDao.addMoney();
      }
      
      @Override
      public void addMoney() {
          String sql = "update changemoney set money=money+? where name = ?";
          jdbcTemplate.update(sql,100,"zhangsan");
      }
      
      @Override
      public void reduceMoney() {
          String sql = "update changemoney set money=money-? where name = ?";
          jdbcTemplate.update(sql,100,"lisi");
      }
      

      Snipaste_2020-10-22_21-58-48

    4. 上面代码,如果正常执行没有问题,但是如果代码执行过程中产生问题,有问题

      1)上面的问题如何解决?

      *使用事务进行解决

      2)事务操作过程

    事务操作(Spring事务管理介绍)

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

    2. 在Spring进行事务管理操作

      1)有两种方式:编程式事务管理和声明式事务管理(使用)

    3. 声明式事务管理

      1)基于注解方式

      2)基于xml配置文件方式

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

    5. Spring事务管理API

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

      Snipaste_2020-10-22_22-13-39

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

    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: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/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
      ">
      

      2)开启事务的注解

      <!--开启事务-->
      <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
      
    3. 在service类上面(获取service类里面方法上面)添加事务注解

      1)@Transactional,这个注解添加到类上面,也可以添加到方法上面

      2)如果把这个注解添加类上面,这个类里面所有方法都添加了 事务

      3)如果把这个注解添加到方法上面,为这个方法添加事务

    @Service
    @Transactional
    public class UserService {
        @Autowired
        private UserDao userDao;
    
        public void countMoney(){
            userDao.reduceMoney();
            int i = 1/0;
            userDao.addMoney();
        }
    }
    

    Snipaste_2020-10-23_07-44-45

    事务操作(声明式事务管理参数配置)

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

      Snipaste_2020-10-23_07-46-46

    2. propagation:事务传播行为

      Snipaste_2020-10-23_07-52-40

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

      Snipaste_2020-10-23_07-55-19

      @Service
      @Transactional(propagation = Propagation.REQUIRED)
      public class UserService {
          @Autowired
          private UserDao userDao;
      
          public void countMoney(){
              userDao.reduceMoney();
              int i = 1/0;
              userDao.addMoney();
          }
      }
      
    3. isolation:事务隔离级别

      1)事务有特性称为隔离性,多事务操作之间不会产生影响,不考虑隔离性产生很多问题。

      2)有三个读问题:脏读、不可重复读、虚(幻)读

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

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

      5)虚读:一个未提交事务读取到另一个提交事务添加数据

      6)解决:通过设置事务隔离级别,解决读问题

      Snipaste_2020-10-23_08-07-19

      @Service
      @Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.REPEATABLE_READ)
      public class UserService {
      
    4. timeout:超时时间

      1)事务需要在一定时间内进行提交,如果不提交进行回滚

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

    5. readOnly:是否只读

      1)读:查询操作,写:添加修改删除操作

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

      3)设置readOnly值是true,设置成true之后,只能查询

    6. rollbackFor:回滚

      1)设置出现哪些异常进行事务回滚

    7. noRollbackFor:不回滚

      1)设置出现哪些异常不进行事务回滚

    事务操作(XML声明式管理)

    1. 在spring配置文件中进行配置

      第一步:配置事务管理器

      第二步:配置通知

      第三步:配置切入点和切面

      <?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:context="http://www.springframework.org/schema/context"
             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/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.spring.transaction"></context:component-scan>
      
          <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
              <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
              <property name="url" value="jdbc:mysql://localhost:3306/count"></property>
              <property name="username" value="root"></property>
              <property name="password" value="root"></property>
          </bean>
      
          <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
              <property name="dataSource" ref="dataSource"></property>
          </bean>
      
          <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
              <property name="dataSource" ref="dataSource"></property>
          </bean>
          <tx:advice id="txadvice">
              <tx:attributes>
                  <tx:method name="countMoney" propagation="REQUIRED"/>
              </tx:attributes>
          </tx:advice>
      
          <aop:config>
              <aop:pointcut id="p" expression="execution(* com.spring.transaction.service.UserService.*(..))"/>
              <aop:advisor advice-ref="txadvice" pointcut-ref="p"></aop:advisor>
          </aop:config>
      </beans>
      

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

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

      import com.alibaba.druid.pool.DruidDataSource;
      import org.springframework.context.annotation.Bean;
      import org.springframework.context.annotation.ComponentScan;
      import org.springframework.context.annotation.Configuration;
      import org.springframework.jdbc.core.JdbcTemplate;
      import org.springframework.jdbc.datasource.DataSourceTransactionManager;
      import org.springframework.transaction.annotation.EnableTransactionManagement;
      
      import javax.sql.DataSource;
      
      @Configuration
      @ComponentScan(basePackages = "com.spring.transaction") //组件扫描
      @EnableTransactionManagement // 开启事务
      public class TxConfig {
          @Bean
          public DruidDataSource getDruidDataSource(){
              DruidDataSource dataSource = new DruidDataSource();
              dataSource.setDriverClassName("com.mysql.jdbc.Driver");
              dataSource.setUrl("jdbc:mysql://localhost:3306/count");
              dataSource.setUsername("root");
              dataSource.setPassword("root");
              return dataSource;
          }
      
          @Bean
          public JdbcTemplate getJdbcTemplate(DataSource dataSource){
              JdbcTemplate jdbcTemplate = new JdbcTemplate();
              jdbcTemplate.setDataSource(dataSource);
              return jdbcTemplate;
          }
      
          @Bean
          public DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource){
              DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
              transactionManager.setDataSource(dataSource);
              return transactionManager;
          }
      
      }
      

    Snipaste_2020-10-23_10-00-40

  • 相关阅读:
    如何在Ubuntu Server 18.04上安装Microsoft的Procmon
    如何在Ubuntu 20.04上安装Wine 5.0
    如何在Kali Linux 2020中启用SSH服务
    如何在Ubuntu 20.04 LTS Focal Fossa上安装Apache Groovy
    如何使用命令在Ubuntu 20.04 Linux上安装Vmware Tools
    在Ubuntu 20.04 LTS Focal Fossa上安装Zabbix Agent
    hdu 2089 不要62
    hdu 2093 成绩排名
    hdu 2104 hide handkerchief
    leetcode147对链表进行插入排序
  • 原文地址:https://www.cnblogs.com/coderD/p/13862514.html
Copyright © 2011-2022 走看看