栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring5框架学习(四)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring5框架学习(四)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

Spring5框架学习(四)
  • 一、事务操作
    • 传播行为
    • 隔离行为
    • transactionManager属性
    • propagation 属性
    • isolation属性
    • timeout readOnly
    • 同一个类中函数相互调用


一、事务操作

事务操作的原理
Spring事务的本质其实就是数据库对事务的支持,使用JDBC的事务管理机制,就是利用java.sql.Connection对象完成对事务的提交,那在没有Spring帮我们管理事务之前,我们要怎么做。

TransactionDefinition类方法

public interface TransactionDefinition {

    
    int getPropagationBehavior();

    
    int getIsolationLevel();

    
    int getTimeout();

    
    boolean isReadOnly();

    
    @Nullable
    String getName();
}

事务属性包含了5个方面:传播行为、隔离规则、回滚规则、事务超时、是否只读。

传播行为

当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。Spring定义了七种传播行为

隔离行为

隔离级别定义了一个事务可能受其他并发事务影响的程度。
1.脏读(Dirty reads)—— 事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据。
2.不可重复读(Nonrepeatable read)—— 事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致。
3.幻读(Phantom read)—— 系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表
transactionManager属性

当存在多个数据源时,往往需要不同的数据源,使用不同的事物管理器,可以使用value属性,或者transactionManager属性指定具体的事物管理器。

propagation 属性

propagation用于指定事务的传播行为,默认值为 REQUIRED。

isolation属性

isolation用于指定事务的隔离规则,默认值为DEFAULT。

timeout readOnly

timeout用于设置事务的超时属性。
readOnly用于设置事务是否只读属性。

@Transactional 注解尽量直接加在方法上,且必须添加在public方法上,private、protected方法上是无效的

同一个类中函数相互调用

同一个类AClass中,有两个函数aFunction、aInnerFunction。aFunction调用aInnerFunction。而且aFunction函数会被外部调用。
情况一:两个函数都添加了@Transactional注解。aInnerFunction抛异常。
情况二:两个函数都添加了@Transactional注解。
情况三:aFunction不添加注解,aInnerFunction添加注解。aInnerFunction抛异常。

public class Class1 {

    @Transactional(rollbackFor = Exception.class)
    public void aFunction() {
        //todo: 数据库操作A(增,删,该)
        aInnerFunction(); // 调用内部没有添加@Transactional注解的函数
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
    private void aInnerFunction() {
        //todo: 操作数据B(做了增,删,改 操作)
        throw new RuntimeException("函数执行有异常!");
    }

}

结果:两个函数对数据库的操作都不会回滚。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1003360.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号