Spring事务、事务的隔离级别、对应的脏数据程度

本文深入讲解了事务的基本概念及其四大特性:原子性、一致性、隔离性和持久性,并通过实例介绍了如何在Spring框架下配置和使用事务管理器进行事务控制。

1.什么是事务

事务保证多条sql语句 要么执行,要么都不执行!

四大特性:高频面试题

  • 原子性: 不可分割,sql语句 要么执行,要么都不执行

  • 一致性 : 转账例子 a 向 b 转 100 a必须减100 b增加100 a和b总数不表

  • 隔离性: 多个sql连接之间的数据影响 一个sql连接 开启事务在修 id 为 1的 学生,改连接未提交事务 ,另外的sql不能访问到 未提交事务的 数据 sql 连接的隔离

  • 持久性 : 提交之后数据可以持久保存,掉电不丢失

开启事务

1.配置事务管理器

    <!-- 开启事务-->

    <!--1.配置事务管理器-->

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

        <property name="dataSource" ref="dataSource"></property>

    </bean>


2.注解式事务

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

使用

package com.qfedu.service.impl;

import com.qfedu.dao.AccountDao;
import com.qfedu.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Service
public class AccountServiceImpl implements AccountService {

    @Autowired
    private AccountDao accountDao;

    /**
     * propagation  事务的传播行为    调用方法之间  开的事务 是否会 传播其他被调用的方法上

	*  Propagation.REQUIRE  必须开启事务 如果当方法被其他调用 ,但是其他方法 没有开启事务  当前方法自己开启事务
     *             如果当方法被其他调用 ,但是其他方法  其他方法开启事务  当前方法使用 被调用方法事务 自己无需开启
     *  Propagation.SUPPORTS  被调用的方法 开启了事务 就使用原有事务
     *                         被调用的方法 没有事务   不使用事务
     *
     * isolation   隔离级别  解决是 多个sql连接之间 事务允许参数据的程度
     *            Isolation.READ_COMMITTED  读已提交
     *
     * readOnly = false
     *         readOnly true  效率高 主要用于查询
     *                  false       用于修改
     *
     * timeout  未事务设置超时
     *
     * @param fromId
     * @param toId
     * @param money
     * @return
     */
    // 在当前方法开启 事务
    @Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.READ_COMMITTED,readOnly = false)
    @Override
    public boolean transMoney(int fromId, int toId, float money) {

        // 减钱
        int num1 =    accountDao.updateAccount(fromId,-money);

        int a = 1/0;

        // 加钱
        int num2 =  accountDao.updateAccount(toId,money);

        if (num1 >0 & num2>0){
            return  true;
        }

        return false;
    }


}

3.使用aop 配置事务

    <!--开启事务注解 第二种方式-->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <!-- name:*表示任意方法名称 -->
            <tx:method name="*" propagation="REQUIRED"
                       isolation="DEFAULT" read-only="false" />
        </tx:attributes>
    </tx:advice>


    <!-- 6.编写aop,让spring自动对目标生成代理,需要使用AspectJ的表达式 -->
    <aop:config>
        <!-- 切入点 -->
        <aop:pointcut expression="execution(* com.qfedu.service.impl.*.*(..))"
                      id="txPointCut" />
        <!-- 切面:将切入点与通知整合 -->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut" />
    </aop:config>



propagation 事务的传播行为

调用方法之间 开的事务 是否会 传播其他被调用的方法上

1、Propagation.REQUIRE 必须开启事务(适用增删改)
1、1如果当方法被其他调用 ,但是其他方法 没有开启事务 当前方法自己开启事务
1、2如果当方法被其他调用 ,但是其他方法 其他方法开启事务 当前方法使用 被调用方法事务 自己无需开启

2、Propagation.SUPPORTS 不一定开启事务(适用查询)
2、1被调用的方法 开启了事务 就使用原有事务
2、2被调用的方法 没有事务 不使用事务

isolation 事务的隔离级别

作用: 解决是 多个sql连接之间 事务允许脏数据的程度

先简单说一下脏数据的程度

1、脏读
:一个事务读取到另一个事务未提交的数据
2、不可重复读
:在一个事务中,反复读取同一条数据,两次结果不一致
3、幻影读
:3、1、在同一个事务中,按同一条件查询,有多条结果
,按同一条件查询,两次结果数量不一致

事务隔离级别
1、READ_UNCOMMITTED、读未提交
:一个事务读取到另一个事务未提交的数据,
无隔离,容易脏数据
2、READ_COMMITTED 读已提交
:一个事务读取到另一个事务提交的数据,解决脏读问题,
3、REPEATABLE_READ 、
:可以解决脏读和不可重复读,不能解决幻影读
4、SERIALIZABLE、
:可以解决脏读和不可重复读,幻影读

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值