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
猜你喜欢
- SpringMVC的几个模型对象模型对象的作用主要是保存数据,可以借助它们将数据带到前端。常用的模型对象有以下几个:1.ModelAndVi
- 使用的是iTextSharp添加PDF水印,由于是接口动态生成PDF,所以采用的是全部是内存流的形式,而且水印是平铺是。iTextSharp
- Java线程分为两类分别为daemon线程(守护线程)和User线程(用户线程),在JVM启动时候会调用main函数,main函数所在的线程
- C#限速下载网络文件的方法,具体如下:using System;using System.Collections.Concurrent;us
- Nacos简介Nacos 英文全称为 Dynamic Naming and Configuration Service,是一个由阿里巴巴团队
- 之前一篇文章研究完横向二级菜单,发现其中使用了SparseArray去替换HashMap的使用.于是乎自己查了一些相关资料,自己同时对性能进
- 使用ehcache-spring-annotations使得在工程中简单配置即可使用缓存下载地址:http://code.google.co
- SpringBoot是什么?SpringBoot是spring家族中微型框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。
- MainActivity如下:package cc.ab;import android.os.Bundle;import android.p
- 一、为什么按值调用和按引用调用?方法或函数可以通过两种方式调用。一种是按值调用,另一种是按引用调用,这两种方式通常根据作为输入或参数传递给它
- <FrameLayout &
- 打注解@SpringBootTest的时候不会出现提示但是又导入了 <dependency> &nb
- 什么是Stream流?Stream流是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。Stream的优点:声明性,可复合,可并行。
- 本问介绍了Collections工具类两种sort()方法,具体如下:一、Collections工具类两种sort()方法格式一: publ
- 背景在我们日常开发中,多线程管理一直是非常头疼的问题之一,尤其在历史性长,结构复杂的app中,线程数会达到好几百个甚至更多,然而过多的线程不
- 1.PDF文件简介PDF是可移植文档格式,是一种电子文件格式,具有许多其他电子文档格式无法相比的优点。PDF文件格式可以将文字、字型、格式、
- 本文为大家分享了WebSocket实现Web聊天室的具体代码,供大家参考,具体内容如下一.客户端JS代码如下:/* * 这部分
- 基本概念:类加载的过程大致分为三个阶段1、加载阶段:本阶段主要把class的二进制代码加载进入JVM,并且进行常量池(类名,方法名,字段名)
- private void btnSave_Click(object sender, RoutedEventArgs e)
- 罗马数字转整数罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。