事务概念

1、什么是事务
(1)事务是数据库操作最基本单元。逻辑上一组操作,要么都成功,要么失败
(2)典型场景:银行转账

*A转100元给B
*A少100,B多100

2、事务四个特性(ACID)
原子性 一致性 隔离性 持久性
3、事务操作基本过程(一般把事务加到service层)

package com.spring.service;

import com.spring.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {
//    注入dao
    @Autowired
    private UserDao userDao;
//转账的操作
    public void accountMoney(){
        
        try {
            //        第一步 开启事务
            //        第二步  进行业务操作

            //        a少100
            userDao.reduceMoney();

//            模拟异常
            int i = 10/0;

//            b多100
            userDao.addMoney();

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

Spring事务管理

1、事务添加到Service层
2、Spring进行事务管理两种操作方式

编程式        声明式(常用)

3、声明式:
(1)基于注解
(2)基于XML方式
4、在spring进行声明式事务管理,底层使用AOP原理
5、Spring进行事务管理的API
(1)提供一个接口,针对不同框架提供不同实现类

事务操作(基于注解声明式)

1、在spring配置文件创建事务管理器
2、在spring配置文件 开启事务注解
(1)spring配置文件中引入名称空间tx
(2)开启事务注解

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

<!--    开启组件扫描-->
    <context:component-scan base-package="com.spring"></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="123456" />
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
    </bean>

<!--    配置JdbcTemplate对象-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!--        注入dataSource-->
        <property name="dataSource" ref="dataSource"></property>
    </bean>

<!--    创建事务管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--        注入数据源-->
        <property name="dataSource" ref="dataSource"></property>
    </bean>

<!--    开启事务注解-->
    <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
</beans>

3、在Service类上(或service类中方法上)添加事务注解

package com.spring.service;

import com.spring.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional   //可以添加到类上(类中所有方法都添加事务注解),也可以添加到方法上
public class UserService {
//    注入dao
    @Autowired
    private UserDao userDao;
//转账的操作
    public void accountMoney(){

        userDao.reduceMoney();

//        模拟异常
        int i =10/0;
        
        userDao.addMoney();


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

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

spring 事务 应用 spring事务的使用_spring

(1)propagation:事务传播行为(多事务方法直接调用,)

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

spring 事务 应用 spring事务的使用_java_02


(2)isolation:事务隔离级别

多事务操作之间不会产生影响。
三个读问题:脏读、不可重复读、虚(幻)读
****脏读:一个未提交事务读取到另一个未提交事务的数据
****不可重复读:一个未提交事务读取到另一提交事务修改数据
****虚(幻)读:一个未提交事务读取到另一个提交事务添加数据

spring 事务 应用 spring事务的使用_spring_03

(3)timeout:超时时间

事务需要在一定时间内进行提交,超时回滚
默认值是-1,设置时间以秒为单位

(4)readOnly:是否只读(默认值为false)
(5)rollbackFor:回滚
(6)norollbackFor:不回滚

设置出现哪些异常进行事务回滚或者不进行事务回滚
@Transactional(propagation = Propagation.REQUIRED , isolation = Isolation.REPEATABLE_READ ,  timeout = -1, readOnly = false)