Spring总结—事务

Spring总结—事务

在这里插入图片描述
(1)创建数据库表,添加记录
在这里插入图片描述
(2)创建service,搭建dao,完成对象创建和注入关系
service注入dao,在dao中注入JDBCTemplate,JDBCtemplate中注入DataSource
(3)转账实现
多钱与少钱的方法

@Override
public void addMoney() {
    
    
    String sql="update t_account set money=money+? where username=?";
    int marry = jdbcTemplate.update(sql, 100, "mary");
    System.out.println(marry);

}

@Override
public void reduceMoney() {
    
    
    String sql="update t_account set money=money-? where username=?";
    int lucy = jdbcTemplate.update(sql, 100, "lucy");
    System.out.println(lucy);
}

转账的方法(二者都实现,事务—都实现)

@Autowired
private UserDao userDao;
public void setMoney(){
    
    
    userDao.reduceMoney();
    userDao.addMoney();
}

(4)上面代码,如果正常执行没有问题,但是如果执行过程中出现异常,则会出现问题。
在这里插入图片描述
执行后,不会执行加钱的方法
上面的问题怎么解决呢?
使用事务进行解决(要么都成功,要么都失败)
在这里插入图片描述

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

  1. 事务添加到JavaEE三层结构里面
    service层(业务逻辑层)web层(业务) dao层
  2. 在spring进行事务管理操作
    有两种方式 :编程式事务管理和声明式事务管理(使用) (一般不会使用编程式,会使代码臃肿)
  3. 声明式事务管理
    基于注解方式(使用)
    基于xml配置文件方式
  4. 在spring 进行声明式事务管理,底层使用AOP
  5. spring事务管理API
    提供了一个接口,代表事务管理器,这个接口针对不同的框架提供不同的实现类,PlatformTransactionManager接口中有各种实现类
    在这里插入图片描述
    事务操作 (注解声明式事务管理)
    (1)在Spring配置文件中配置事务管理器
    在这里插入图片描述
    (2)在spring 配置文件中开启事务注解
    在spring配置文件中引入名称空间tx
    开启事务注解
    在这里插入图片描述
    (3)在service类上面添加事务注解
    在这里插入图片描述
    @Transactional,这个注解添加到类上面,也可以添加到方法上面
    如果把这个注解添加类上面,这个类里面所有的方法都添加了事务
    如果把这个注解添加到方法上面,则只有这个方法添加了事务
  6. 事务操作(声明式事务管理参数配置)
    (1)在service类上面添加注解@Transactional,在这个注解里面可以配置事务相关参数
    在这里插入图片描述
    <1>Propagation 事务传播行为
    多事务方法之间直接进行调用,在这个过程中事务是如何进行管理的
    在这里插入图片描述
    在这里插入图片描述
    <2> Isolation :事务隔离级别
    事务有个特性称为隔离性,多事务操作之间不会产生影响,不考虑隔离性会产生很多问题。
    有三个对问题:脏读、不可重复读、虚(幻)读
    脏读:一个未提交事务读取到另一个未提交事务的数据
    不可重复读:一个未提交事务读取到另一个已提交事务的数据
    虚读:一个未提交事务读到另一个提交事务添加的数据

通过设置事务隔离级别,解决读问题
在这里插入图片描述
在这里插入图片描述
<3>timeout:超时时间
事务在一定的时间内进行提交,如果不提交进行回滚
默认值是-1 ,设置时间以秒为单位进行计算
<4> readOnly :是否只读
读:查询操作
写:添加修改删除操作
readOnly默认值是false。表示可以查询,可以添加修改删除操作
设置readonly的值是TRUE,设置成TRUE后,只能查询。
<5>rollbackfor :回滚 设置出现哪些异常进行事务回滚
<6>norollbackfor :不回滚 设置出现哪些异常不进行回滚

  1. 事务操作(xml声明式事务管理)
    (1)第一步配置事务管理器
    (2)第二步配置通知
    (3)第三步配置切入点和切面
	<!--    配置事务管理器-->
    <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="setMoney" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>

<!--    第三步配置切入点和切面  -->
    <aop:config>
<!--        配置切入点  切入点:被加强的方法-->
        <aop:pointcut id="point" expression="execution(* com.sun.Spring.Dao.Service.UserService.*(..))"/>
<!--        配置切面    切面:将要加强的内容作用到被加强的方法中的过程-->
        <aop:advisor advice-ref="txadvice" pointcut-ref="point"/>
    </aop:config>

  1. 事务操作(完全注解开发)
    创建配置类,使用配置类类替代xml文件
    配置类
package com.sun.Spring.Dao.config;

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.sun.Spring.Dao")
//开启事务
@EnableTransactionManagement
public class TxConfig {
    
    
//    创建数据库连接池
    @Bean
    public DruidDataSource getDruidDataSource(){
    
    
        DruidDataSource dataSource=new DruidDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql:///java");
        dataSource.setUsername("root");
        dataSource.setPassword("123456");
        return dataSource;     //返回值是DruidDataSource类型的
    }
//    创建JDBCTemplate对象
    @Bean
    public JdbcTemplate getJdbcTemplate(DataSource dataSource){
    
    
//        到ioc容器中根据类型找到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;
    }
}

猜你喜欢

转载自blog.csdn.net/sx17860543449/article/details/123694773