Spring5第三部分:事务隔离

目录

基本概念

事务特性ACID

事务操作流程 

Spring事务管理方式

声明式事务管理

实现方式

底层原理

事务管理器接口

事务操作

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

① xml配置方式

② config类纯java配置

2、使用事务注解@Transactional

3、@Transactional的参数说明

1)propagation:事务传播行为

2)ioslation:事务隔离级别

3)timeout:超时时间

4)readOnly:是否只读

5)rollbackFor:回滚

6)noRollbackFor:不回滚

XML 声明式事务管理(补充)


基本概念

事务特性ACID

与数据部分一致(1)原子性 (2)一致性 (3)隔离性 (4)持久性

事务操作流程 

  1. 开启事务
  2. 进行业务操作
  3. 无异常提交事务
  4. 出现异常事务回滚

Spring事务管理方式

  • 编程式事务管理
  • 声明式事务管理(本文内容)

声明式事务管理

实现方式

  1. 基于注解方式(使用)
  2. 基于xml方式

底层原理

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

事务管理器接口

 Spring事务管理接口PlatformTransactionManager的实现类DataSourceTransactionManager

 Spring底层进行事务控制时就可以调用这个对象里面相应的方法,依赖于一个数据源对象dataSource,可以通过xml或配置类进行配置。

事务操作

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

① xml配置方式

在 spring 配置文件引入名称空间 tx;创建事务管理器并注入数据源dataSource;开启事务注解

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

<!-- 数据库连接池 -->
<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>


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

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

② config类纯java配置

@Configuration //配置类
@ComponentScan(basePackages = "com.myungho") //组件扫描
@EnableTransactionManagement //开启事务
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;
    }
}

2、使用事务注解@Transactional

一般用在service层,即在业务逻辑层进行事务管理。

  1. @Transactional注解添加到类上面,也可以添加方法上面
  2. 如果把这个注解添加类上面,这个类里面所有的方法都添加事务
  3. 如果把这个注解添加方法上面,为这个方法添加事务
@Service
@Transactional
public class UserService {

3、@Transactional的参数说明

1)propagation:事务传播行为

@Service
@Transactional(propagation = Propagation.REQUIRED)
public class UserService(){ ... }

Spring框架的事务传播行为共7种

事务传播行为类型说明
PROPAGATION_REQUIRED如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中,最常用。
PROPAGATION_SUPPORTS支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY使用当前的事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

2)ioslation:事务隔离级别

@Service
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.REPEATABLE_READ)
public class UserService(){ ... }

事务有特性成为隔离性,多事务操作之间不会产生影响,不考虑隔离性产生很多问题,有三个读问题:脏读、不可重复读、虚(幻)读

  1. 脏读:一个未提交事务读取到另一个未提交事务的数据
  2. 不可重复读:一个未提交事务读取到另一提交事务修改数据
  3. 虚读:一个未提交事务读取到另一提交事务添加数据

为解决上述问题,设置事务隔离级别来解决

脏读不可重复读幻读

READ UNCOMMITTED

(读未提交)

存在存在存在

READ COMMITTED

(读已提交)

存在存在

REPEATABLE READ

(可重复度)

存在

SERIALIZABLE

(串行化)

3)timeout:超时时间

  1. 事务需要在一定时间内进行提交,如果不提交进行回滚
  2. 默认值是 -1 ,即永不超时。设置时间以秒单位进行计算。

4)readOnly:是否只读

  1. 读:查询操作,写:添加修改删除操作
  2. readOnly 默认值 false,表示可以查询,可以添加修改删除操作
  3. 设置 readOnly 值是 true,设置成 true 之后,只能查询

5)rollbackFor:回滚

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

6)noRollbackFor:不回滚

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

XML 声明式事务管理(补充)

与使用@Transactional注解效果相同

第一步 配置事务管理器
第二步 配置通知
第三步 配置切入点和切面
<!--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(* com.myungho.spring5.service.UserService.*(..))"/>
    <!--配置切面-->
    <aop:advisor advice-ref="txadvice" pointcut-ref="pt"/>
</aop:config>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值