【SSM框架】Spring笔记 — 事务详解

1、Spring的事务管理:

  • 事务原本是数据库中的概念,在实际项目的开发中,进行事务的处理一般是在业务逻辑层, 即 Service 层。这样做是为了能够使用事务的特性来管理关联操作的业务。

在 Spring 中通常可以通过以下两种方式来实现对事务的管理:

(1)使用 Spring 的事务注解管理事务;使用 @Transactional 注解完成事务控制,此注解可添加到类上,则对类中所有方法执行事务的设定。

(2)使用 AspectJ 的 AOP 配置管理事务(声明式事务管理);声明式事务(必须掌握),在配置文件中添加一次,整个项目遵循事务的设定。

2、Spring中事务的五大隔离级别:

1)未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据

2)提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)

3)可重复读(Repeated Read):可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读,但是innoDB解决了幻读。

4)串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞。

5)使用数据库默认的隔离级别 isolation = Isolation.DEFAULT

MySQL:mysql 默认的事务处理级别是’REPEATABLE-READ’,也就是可重复读

Oracle:oracle 数据库支持READ COMMITTED 和 SERIALIZABLE 这两种事务隔离级别。默认系统事务隔离级别是READ COMMITTED,也就是读已提交

3、Spring事务的传播特性:

  • 多个事务之间的合并,互斥等都可以通过设置事务的传播特性来解决

常用:

PROPAGATION_REQUIRED:必被包含事务(增删改必用)

PROPAGATION_REQUIRES_NEW:自己新开事务,不管之前是否有事务

PROPAGATION_SUPPORTS:支持事务,如果加入的方法有事务,则支持事务,如果没有,不单开事务

PROPAGATION_NEVER:不能运行在事务中,如果包在事务中,抛异常

PROPAGATION_NOT_SUPPORTED:不支持事务,运行在非事务的环境

不常用:

PROPAGATION_MANDATORY:必须包在事务中,没有事务则抛异常

PROPAGATION_NESTED:嵌套事务

4、基于注解的事务添加步骤:

1)在applicationContext_service.xml文件中添加事务管理器(事务管理器用来生成相应技术的连接+执行语句的对象.)

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <!--因为事务必须关联数据库处理,所以要配置数据源-->
    <property name="dataSource" ref="dataSource"></property>
</bean>

2)在applicationContext_service.xml文件中添加事务的注解驱动

<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>

3)在业务逻辑的实现类上添加注解:@Transactional(propagation = Propagation.REQUIRED)

REQUIRED表示增删改操作时必须添加的事务传播特性

5、@Transactional注解参数详解:

@Transactional(propagation = Propagation.REQUIRED,//&#x4E8B;&#x52A1;&#x7684;&#x4F20;&#x64AD;&#x7279;&#x6027;
               noRollbackForClassName = "ArithmeticException", //&#x6307;&#x5B9A;&#x53D1;&#x751F;&#x4EC0;&#x4E48;&#x5F02;&#x5E38;&#x4E0D;&#x56DE;&#x6EDA;&#xFF08;&#x4F7F;&#x7528;&#x7684;&#x662F;&#x5F02;&#x5E38;&#x7684;&#x540D;&#x79F0;&#xFF09;
               noRollbackFor = ArithmeticException.class,//&#x6307;&#x5B9A;&#x53D1;&#x751F;&#x4EC0;&#x4E48;&#x5F02;&#x5E38;&#x4E0D;&#x56DE;&#x6EDA;&#xFF08;&#x4F7F;&#x7528;&#x7684;&#x662F;&#x5F02;&#x5E38;&#x7684;&#x7C7B;&#x578B;&#xFF09;
               rollbackForClassName = "",//&#x6307;&#x5B9A;&#x53D1;&#x751F;&#x4EC0;&#x4E48;&#x5F02;&#x5E38;&#x5FC5;&#x987B;&#x56DE;&#x6EDA;&#xFF08;&#x4F7F;&#x7528;&#x7684;&#x662F;&#x5F02;&#x5E38;&#x7684;&#x540D;&#x79F0;&#xFF09;
               rollbackFor = ArithmeticException.class,//&#x6307;&#x5B9A;&#x53D1;&#x751F;&#x4EC0;&#x4E48;&#x5F02;&#x5E38;&#x5FC5;&#x987B;&#x56DE;&#x6EDA;&#xFF08;&#x4F7F;&#x7528;&#x7684;&#x662F;&#x5F02;&#x5E38;&#x7684;&#x7C7B;&#x578B;&#xFF09;
               timeout = -1, //&#x8FDE;&#x63A5;&#x8D85;&#x65F6;&#x8BBE;&#x7F6E;,&#x9ED8;&#x8BA4;&#x503C;&#x662F;-1,&#x8868;&#x793A;&#x6C38;&#x4E0D;&#x8D85;&#x65F6;
               readOnly = false, //&#x9ED8;&#x8BA4;&#x662F;false,&#x5982;&#x679C;&#x662F;&#x67E5;&#x8BE2;&#x64CD;&#x4F5C;,&#x5FC5;&#x987B;&#x8BBE;&#x7F6E;&#x4E3A;true.

               isolation = Isolation.DEFAULT//&#x4F7F;&#x7528;&#x6570;&#x636E;&#x5E93;&#x81EA;&#x5DF2;&#x7684;&#x9694;&#x79BB;&#x7EA7;&#x522B; &#xA0; &#xA0; &#xA0; &#xA0;
               )

6、声明式事务:

Spring 的声明式事务要求项目中的方法命名有规范

1)完成增加操作包含 add save insert set

2)更新操作包含 update change modify

3)删除操作包含 delete drop remove clear

4)查询操作包含 select find search get

配置事务切面时可以使用通配符*来匹配所有方法。

<!--添加事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
</bean>

<!--配置事务切面-->
<tx:advice id="myadvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="*select*" read-only="true">
        <tx:method name="*find*" read-only="true">
        <tx:method name="*search*" read-only="true">
        <tx:method name="*get*" read-only="true">
        <tx:method name="*insert*" propagation="REQUIRED" no-rollback-for="ArithmeticException">
        <tx:method name="*add*" propagation="REQUIRED">
        <tx:method name="*save*" propagation="REQUIRED" no-rollback-for="ArithmeticException">
        <tx:method name="*set*" propagation="REQUIRED">
        <tx:method name="*update*" propagation="REQUIRED">
        <tx:method name="*change*" propagation="REQUIRED">
        <tx:method name="*modify*" propagation="REQUIRED">
        <tx:method name="*delete*" propagation="REQUIRED">
        <tx:method name="*remove*" propagation="REQUIRED">
        <tx:method name="*drop*" propagation="REQUIRED">
        <tx:method name="*clear*" propagation="REQUIRED">
        <tx:method name="*" propagation="SUPPORTS">
    </tx:method></tx:method></tx:method></tx:method></tx:method></tx:method></tx:method></tx:method></tx:method></tx:method></tx:method></tx:method></tx:method></tx:method></tx:method></tx:method></tx:attributes>
</tx:advice>
<!--绑定切面和切入点-->
<aop:config>
    <aop:pointcut id="mycut" expression="execution(* com.bjpowernode.service.impl.*.*(..))"></aop:pointcut>
    <aop:advisor  advice-ref="myadvice" pointcut-ref="mycut"></aop:advisor>
</aop:config>

情景:

在不同的事务传播特性下,UsersServiceImpl类中方法中调用AccountServiceImpl类中的方法(此访问中抛出异常),推测最后数据库中users表和accounts是否成功更新了数据。

Original: https://www.cnblogs.com/Burning-youth/p/16311110.html
Author: 猿头猿脑的王狗蛋
Title: 【SSM框架】Spring笔记 — 事务详解

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/586392/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • JBoss AS7(Application Server 7)的Standalone模式和Domain模式

    JBoss AS7(Application Server 7)支持两种引导模式:standalone和domain(域)。 Standalone模式对于很多应用,并不需要domai…

    Java 2023年6月6日
    094
  • 《Java2 实用教程(第五版)》教学进程

    《Java2 实用教程(第五版)》教学进程 目录 《Java2 实用教程(第五版)》教学进程 预备作业1:你期望的师生关系是什么? 预备作业2 :学习基础和C语言基础调查 预备作业…

    Java 2023年5月29日
    0101
  • SpringBoot 项目部署 (配置文件分离)

    SpringBoot 配置文件加载 SpringBoot 加载配置文件的优先级如下: 当前目录下的 config 子目录; 当前目录; classpath下的 config文件夹;…

    Java 2023年6月7日
    074
  • MyBatis的注解实现复杂映射开发

    xml 配置方式实现复杂映射回顾 ​ 实现复杂映射我们之前可以在映射文件中通过配置来实现,使用注解开发后,我们可以通过 @Results 注解, @Result 注解, @One …

    Java 2023年6月5日
    084
  • noi.ac#309 Mas的童年(子集乱搞)

    Sol 记(s_i)表示前(i)个数的前缀异或和,我们每次相当于要找一个(j)满足(0 < j < i)且((s_i \oplus s_j) + s_j)最大 然后下面…

    Java 2023年5月30日
    074
  • Lua:Nginx Lua环境配置,第一个Nginx Lua代码

    一、编译安装LuaJIT Lua:编译安装LuaJIT,第一个Lua程序 http://blog.csdn.net/guowenyan001/article/details/482…

    Java 2023年5月30日
    068
  • 崔用志-微信开发-java版本

    崔用志-微信开发-java版本 今天看到一些关于微信开发的知识蛮好的博客,分享给大家,希望对大家有帮助。 总结来自:http://www.cuiyongzhi.com/ Origi…

    Java 2023年5月29日
    074
  • 多线程与高并发(三)—— 源码解析 AQS 原理

    一、前言 AQS 是一个同步框架,关于同步在操作系统(一)—— 进程同步 中对进程同步做了些概念性的介绍,我们了解到进程(线程同理,本文基于 JVM 讲解,故下文只称线程)同步的工…

    Java 2023年6月9日
    079
  • Java8 提供的流式操作

    参考资料 流式操作 Stream 代表一个支持串行或并行聚集操作的元素序列。 filter filter 生成一个新的 Stream,该 Stream 所有元素都满足 predic…

    Java 2023年6月9日
    075
  • Java 8新特性:新语法方法引用和Lambda表达式及全新的Stream API

    方法引用(Method references) 我们来看个接口和一个方法 <span class="hljs-keyword">public<…

    Java 2023年5月29日
    0102
  • SpringBoot 2.0 开发案例之百倍级减肥瘦身之旅

    前言 为了存我的小黄图,最近在做一款图床服务,集成了各种第三方云存储服务,目前正在内部测试阶段。项目是以Jar的形式运行在腾讯云上,不要问我为什么使用腾讯云了,因为阿里云老用户和狗…

    Java 2023年5月30日
    068
  • Mybaitis入门基础(一)MyBatis的概念引入及工作原理

    一:框架前言的那些事 良将难求 胜铁骑三千 益友知遇 领人间无数,三国鼎立中魏、蜀,吴三国的三位皇帝曹操、刘备、刘权他们都有很多谋士(出谋划策的人)。这些谋士其实就是他们出攻城略地…

    Java 2023年6月14日
    080
  • 面试突击59:一个表中可以有多个自增列吗?

    自增列可使用 auto_increment 来实现,当一个列被标识为 auto_increment 之后,在添加时如果不给此列设置任何值,或给此列设置 NULL 值时,那么它会使用…

    Java 2023年5月29日
    079
  • 玩转 SpringBoot2.x 之整合 shiro 权限框架

    序 在实际项目中,经常需要用到角色权限区分,以此来为不同的角色赋予不同的权利,分配不同的任务。比如,普通用户只能浏览;会员可以浏览和评论;超级会员可以浏览、评论和看视频课等;实际应…

    Java 2023年5月30日
    074
  • springBoot使用注解Aop实现日志模块

    我们在日常业务操作中需要记录很多日志,可以在我们需要的方法中对日志进行保存操作,但是对业务代码入侵性大。使用切面针对控制类进行处理灵活度不高,因此我们可以使用自定义注解来针对方法进…

    Java 2023年6月8日
    099
  • Synchronized底层实现逻辑原理解析

    什么是同步的 如果一个资源被多个线程共享,我们需要同步线程,以避免资源抢占造成的资源数据混乱。在Java中,synchronized是实现线程同步的关键字。 使用synchroni…

    Java 2023年5月29日
    074
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球