【Spring5-05】事务操作

一、事务概念

  1. 什么是事务?
    (1)事务是数据库操作最基本单元,是逻辑上一组操作,要么都成功,如果有一个失败则所有操作都失败
    (2)典型场景:银行转账
    Lucy转账100元给mary,事务(Lucy少100元,mary多100元)
  2. 事务的四个特性
    (1)原子性:事务过程不可分割(lucy少100,mary多100缺一不可)
    (2)一致性:操作事务总量不变
    (3)隔离性:多事务操作,不会产生影响
    (4)持久性:数据需要进行提交

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

在这里插入图片描述

  1. 创建数据库表,添加记录
    在这里插入图片描述
  2. 创建service,搭建dao,完成对象创建和注入关系
    (1)service注入dao,在dao注入JdbcTemplate,在JdbcTemplate注入DataSource
//service注入dao
@Service
public class UserService {
    //注入dao
    @Autowired
    private UserDao userDao;
}

//dao注入JdbcTemplate
@Repository
public class UserDaoImpl implements UserDao{

    //注入dao
    @Autowired
    private JdbcTemplate jdbcTemplate;
}
    <!-- 配置连接池 -->
    <!-- DruidDataSource dataSource = new DruidDataSource(); -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <!-- dataSource.setDriverClassName("com.mysql.jdbc.Driver");
            set方法注入
        -->
        <!-- 获取properties文件内容,根据key获取,使用spring表达式获取 -->
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost:3306/user_db?characterEncoding=utf8&amp;useSSL=false&amp;serverTimezone=UTC&amp;rewriteBatchedStatements=true"></property>
        <property name="username" value="root"></property>
        <property name="password" value="111111"></property>
    </bean>
    
	<!--JdbcTemplate对象-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <!--注入DataSource-->
        <property name="dataSource" ref="dataSource"></property>
    </bean>
  1. 在dao创建两个方法:多钱和少钱方法。在service创建方法(转账的方法)
Dao中:包括UserDao接口及其实现类UserDaoImpl
public interface UserDao {
    //多钱
    public void addMoney();

    //少钱
    public void reduceMoney();
}

@Repository
public class UserDaoImpl implements UserDao{
    //注入dao
    @Autowired
    private JdbcTemplate jdbcTemplate;   
    //多钱
    @Override
    public void addMoney(){
        String sql = "update t_account set money=money+? where username=?";
        jdbcTemplate.update(sql,100,"mary");       
    }
    //少钱
    @Override
    public void reduceMoney(){
        String sql = "update t_account set money=money-? where username=?";
        jdbcTemplate.update(sql,100,"lucy");

    }
}

在service中创建转正的方法
@Service
public class UserService {
    //注入dao
    @Autowired
    private UserDao userDao;

    //转账的方法
    public void accountMoney(){
        //lucy少100
        userDao.reduceMoney();

        //mary多100
        userDao.addMoney();
    }
}
  1. 测试代码
@Test
    public void testAccount(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
        UserService userService = context.getBean("userService", UserService.class);
        userService.accountMoney();
    }
  1. 上述代码如果出现异常则会产生问题(

三、事务操作(事务场景引入)

  1. 上述问题可以使用事务进行解决
  2. 事务操作过程
		//第一步 开启事务
        try{
            //第二步 进行业务操作
            //lucy少100
            userDao.reduceMoney();
            //mary多100
            userDao.addMoney();

            //第三步 没有产生异常,提交事务
        }catch(Exception e){
            //第四步 出现异常,事务回滚
        }

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

  1. 事务一般添加到javaee三层结构里面Service层(业务逻辑层)
  2. 在spring进行事务管理操作
    (1)有两种方式,编程式事务管理和声明式事务管理(使用)
  3. 声明式事务管理
    (1)基于注解方式
    (2)基于xml配置文件方式
  4. 在Spring进行声明式事务管理,底层使用AOP原理
  5. 在spring事务管理API
    (1)提供一个接口,代表事务管理器,这个接口针对不同的框架提供不同的实现类。
    在这里插入图片描述

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

  1. 在spring:配置文件配置事务管理器
	<!--创建事务管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!--注入数据源-->
        <property name="dataSource" ref="dataSource"></property>
    </bean>
  1. 在spring配置文件,开启事务注解
    (1)在spring配置文件引入名称空间tx
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: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/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

(2)开启事务注解

<!--开启事务注解-->
    <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
  1. 在service类上面(或者service类里面方法上面)添加事务注解
    (1)@Transactional,这个注解添加到类上面,也可以添加方法上面
    (2)如果把这个注解添加来上面,这个类里面所有方法都添加事务
    (3)如果吧这个注解添加方法上面,为这个方法添加事务
@Service
@Transactional
public class UserService {

六、事务操作-Spring声明式事务管理-事务参数

  1. 在service类上面添加注解@Transactional,这个注解里面可以配置事务相关参数。
    在这里插入图片描述
6.1 propagation:事务传播行为

(1)多事务方法直接进行调用,这个过程中事务是如何进行管理的(共有7种)
在这里插入图片描述

6.2 ioslation:事务隔离级别

(1)事务有特性成为隔离性,多事务操作之间不会产生影响,不考虑隔离性产生很多问题。
(2)有三个读问题:脏读、不可重复读、虚(幻)读
(3)脏读:一个未提交事务读取到另一个未提交事务的数据
在这里插入图片描述
(4)不可重复读:一个未提交数据读取到另一个已提交事务修改数据
在这里插入图片描述
(5)虚读:一个未提交事务读取到另一提交事务添加数据。
(6)解决:通过设置事务隔离级别,解决读问题。
在这里插入图片描述
事务隔离级别配置:(默认为REPEATABLE_READ)

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

(1)事务需要在一定时间内进行提交,如果不提交进行回滚
(2)默认值-1(表示不超时).设置时间以秒为单位进行设置

6.4 readOnly:是否只读

(1)读:查询操作。写:添加、修改、删除操作
(2)readOnly值默认值false,表示可以查询,可以添加修改删除操作
(3)readOnly值为true时,只能查询。

6.5 rollbackFor:回滚

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

6.6 noRollbackFor:不回滚

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

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

  1. 在spring配置文件进行配置
    (1)第一步 配置事务管理器
    (2)第二步 配置通知
    (3)配置切入点和切面
	<!--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:method name="account*"/>-->
        </tx:attributes>
    </tx:advice>

    <!--3 配置切人点和切面-->
    <aop:config>
        <!--配置切入点-->
        <aop:pointcut id="pt" expression="execution(* cn.dhu.spring5.service.UserService.*(..))"/>

        <!--配置切面-->
        <aop:advisor advice-ref="txadvice" pointcut-ref="pt"></aop:advisor>
    </aop:config>

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

  1. 实际使用springboot进行
  2. 创建配置类,使用配置类替代xml配置文件
@Configuration //配置类
@ComponentScan(basePackages ="cn.dhu") //组件扫描
@EnableTransactionManagement //开启事务
public class TxConfig {
    //创建数据库连接池
    @Bean
    public DruidDataSource getDruidDataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/user_db?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true");
        dataSource.setUsername("root");
        dataSource.setPassword("111111");
        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;
    }
}

参考:本篇内容主要为尚硅谷Spring5听课笔记

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值