SpringAOP事务配置语法及实现过程详解
作者:64Byte 发布时间:2023-12-27 21:26:16
配置事务: 使用的tx前缀的标签, 导入tx的命名空间
配置事务管理器 , 把事务管理器交给Spring管理:
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入DataSource -->
<property name="dataSource" ref="dataSource"/>
</bean>
事务的策略
transaction-manager: 事务增强基于那个事务管理器, 默认值: transactionManager(bean的id)
如果事务管理器的id为transactionManager, 在tx:advice标签中不需要添加transaction-manager属性
<tx:advice id="txAdvice" transaction-manager="txManager">
<!-- 声明事务的规则 : 针对业务层的不同的方法,采用不同的规则-->
<tx:attributes>
<tx:method name="find*" read-only="true" propagation="SUPPORTS" />
<tx:method name="query*" read-only="true" propagation="SUPPORTS"/>
<tx:method name="get*" read-only="true" propagation="SUPPORTS"/>
<tx:method name="add*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
<tx:method name="del*" propagation="REQUIRED" rollback-for="java.lang.Exception" timeout="2"/>
<tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
事务规则的语法:
name: 表示业务层的方法名
read-only: 只读, true 查询中使用这个属性, 默认值: false
propagation: 事务传播机制:
*** REQUIRED:默认值,表示如果存在一个事务,则支持当前事务,如果当前没有事务,则开启一个新的事务. 增删改
*** SUPPORTS:表示如果存在一个事务,则支持当前事务,如果当前没有事务,则按非事务方式执行, 查询
MANDATORY:表示如果存在一个事务,则支持当前事务,如果当前没有事务,则抛出异常
REQUIRES_NEW:表示总是开启一个新的事务,如果当前有一个事务,则将当前事务挂起,开启新事物执行方法.
NOT_SUPPORTED:表示总是以非事务方式执行.如果一个事务已经存在,则将这个存在的事务挂起,然后执行方法.
NEVER:表示总是以非事务方式执行.如果当前存在一个活动的事务,则抛出异常
NESTED:表示如果当前存在一个活动的事务,则创建一个事务作为当前事务的嵌套事务运行,如果没有当前事务,该取值与REQUIRED相同.
timeout: 超时, -1 永不超时, 默认值, 正整数, 单位秒
rollback-for="异常类型", 针对哪一种异常类型进行回滚, ,默认值:RuntimeException
no-rollback-for="异常类型", 不对哪一种异常类型进行回滚
isolation: 事务隔离级别: 数据库来决定
DEFAULT:默认值,表示使用数据库默认的事务隔离级别
READ_UNCOMMITTED:读未提交, 读取到未提交的数据, 所有的数据库都不采用
READ_COMMITTED:读已提交 oracle
REPEATABLE_READ: 可重复读 mysql
SERIALIZABLE: 串行读 安全性最高, 效率最低
timeout: 从执行业务方法开始,到执行完sql语句之间的时候
事务的织入 (把这个事务的通知对那些类的那些方法进行增强)
<!-- 事务的织入 ,把这个事务的通知对那些类的那些方法进行增强-->
<aop:config>
<!-- 切入点-->
<aop:pointcut expression="execution(* spring07.service..*.*(..))" id="pointcut1"/>
<!-- 织入
advice-ref: 通知类的bean
pointcut-ref: 切入点
-->
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/>
</aop:config>
脏读 :一个事务读到了另一个事务的未提交的数据
不可重复读 :一个事务读到了另一个事务已经提交的 update 的数据导致多次查询结果不一致
幻读 :一个事务读到了另一个事务已经提交的 insert 的数据导致多次查询结果不一致
来源:https://www.cnblogs.com/64Byte/p/13118009.html
猜你喜欢
- Spring EL表达式语言,支持在XML和注解中表达式,类是于JSP的EL表达式语言。在Spring开发中经常涉及调用各种资源的情况,包含
- 单例模式的介绍说到单例模式,大家第一反应应该就是——什么是单例模式?,从“单例”字面意思上理解为——一个类只有一个实例,所以单例模式也就是保
- 原理比较简单,引入System.Reflection命名空间,利用反射查看某种Type下的方法,属性,字段和支持的接口等。using Sys
- 1.问题描述在我引入SpringCloud-gateway,运行时报错如下:org.springframework.beans.factor
- 由其他进制转换为十进制比较简单,下面着重谈一谈十进制如何化为其他进制。1.使用Java带有的方法Integer,最简单粗暴了,代码如下//使
- 说明本项目采用 maven 结构,主要演示了 spring mvc + mybatis,controller 获取数据后以json 格式返回
- 参考文章图解Java中插入排序算法的原理与实现实现效果示例代码import java.awt.*;public class AlgoVisu
- SpringBoot是什么?SpringBoot是spring家族中微型框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。
- 最近发现Java原生的Zip压缩组件在压缩过程中,不支持文件名的中文编码,会在压缩过程中把中文文件名变成乱码。Apache的ant包中的压缩
- 在SSH项目中,有时需要由一个Action跳转到另一个Action。有两种方式可以实现Action之间的跳转,一种是chain,另一种是re
- 下面一段简单的代码给大家分享java 获取对象中为null的字段,具体代码如下所述:private static String[] getN
- 网上看了很多篇文章关于如何配置mybatis的logback日志的,复杂的简单的都有,但是有用的没几个,耽误了很多时间。通过对logback
- 新建一个集合List<Bill> billList = new ArrayList<>();将订单中所有物品的名称提
- 一、Nuget安装log4net --> Install-Package log4net二、在AssemblyInfo.cs文件中添加
- 实现多文件的上传,基于标准的http来实现。1.多文件上传MyUploader类的实现:/** * * 同步上传多个文件 * 基于标准的h
- 在我们对数组或者集合类进行操作的时候,经常会遇到这样的需求,比如:是否包含某一个“匹配规则”的元素是
- Android 文件读写操作方法总结在Android中的文件放在不同位置,它们的读取方式也有一些不同。本文对android中对资源文件的读取
- 前言记得前段时间的文章么?redis使用位图法记录在线用户的状态,还是需要自己实现一个IM在线用户状态的记录,今天来讲讲另一方案,布隆过滤器
- 多租户(Multi-Tenant)是SaaS中的一个重要概念,它是一种软件架构技术,在多个租户的环境下,共享同一套系统实例,并且租户之间的数
- 由于 * 一般都比较难理解,程序设计者会设计一个 * 接口供开发者使用,开发者只要知道 * 接口的方法、含义和作用即可,无须知道 * 是