搞懂spring事务

时间:2021-12-23 02:47:29

最近一个官网的项目,我在service层有两个添加数据的操作,很意外报错了,然后就研究到了事务

之前只是知道声明式事务和编程式事务,编程式的事务显得比较麻烦,一般都是使用声明式事务..

spring提供了很多种配置方式:

1 编程式事务:

  开启事务;

  try{

    更新或添加操作;

    提交;

  }catch(..){

    回滚;

  }

2 声明式事务:

  提交,回滚的操作写在了一个代理类里头,在执行事务方法之前开启事务,在执行完方法之前提交或者回滚事务

  

1 给每个bean(service类)配置一个代理类

2 所有service类公用一个代理类

3 拦截器(aop的方式)

4 全注解(在service类加上Transaction)

注 : spring只对runtiomException才会回滚(经测试的) 提供了对应的属性设置异常类型

下面是我项目里头事务的配置 (config配置呢) :

/**
* 注解声明式事务配置(相当于上述的aop方式的配置)
* @author liyong
*
*/
@Configuration
public class TxAdviceTransactionConfig {
private static final String AOP_POINTCUT_EXPRESSION = "execution(* com.mike.mihome.*.service..*.*(..))"; @Autowired
private PlatformTransactionManager transactionManager; @Bean
public TransactionInterceptor txAdvice(){
NameMatchTransactionAttributeSource source = new NameMatchTransactionAttributeSource(); //只读事务,不做更新操作
RuleBasedTransactionAttribute readOnlyTx = new RuleBasedTransactionAttribute();
readOnlyTx.setReadOnly(true);
readOnlyTx.setPropagationBehavior(TransactionDefinition.PROPAGATION_NOT_SUPPORTED); //当前存在事务就使用当前事务,当前不存在事务就创建一个新的事务
RuleBasedTransactionAttribute requiredTx = new RuleBasedTransactionAttribute();
// requiredTx.setRollbackRules(Collections.singletonList(new RollbackRuleAttribute(Exception.class))); //设置异常类型
requiredTx.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
requiredTx.setTimeout(10000); Map<String, TransactionAttribute> txMap = new HashMap<String, TransactionAttribute>();
txMap.put("query*", readOnlyTx);
txMap.put("get*", readOnlyTx); txMap.put("*", requiredTx);
source.setNameMap(txMap); TransactionInterceptor txAdvice = new TransactionInterceptor(transactionManager, source);
return txAdvice;
} @Bean
public Advisor txAdviceAdvisor() {
AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
pointcut.setExpression(AOP_POINTCUT_EXPRESSION);
return new DefaultPointcutAdvisor(pointcut, txAdvice());
}
}

搞懂spring事务

  注 : 我这个项目有点坑,最后才知道是我这数据库不支持事务的缘故,底层引擎是 MyISAM 的...

MyISAM引擎不支持事务

如果要支持事务的话,则考虑InnoDB或BDB存储引擎(日常中一般都是选InnoDB较多)。所以,并不是我的问题,但是了解到了很多问题.

1 spring 事务默认只对运行时异常回滚,非运行时异常是不会滚的哦,所以我的方法里头设置了Exception

2 aop配置方式也有两种: 一种是xml配置和注解的配置

搞懂spring事务的更多相关文章

  1. 这一次搞懂Spring事务注解的解析

    前言 事务我们都知道是什么,而Spring事务就是在数据库之上利用AOP提供声明式事务和编程式事务帮助我们简化开发,解耦业务逻辑和系统逻辑.但是Spring事务原理是怎样?事务在方法间是如何传播的?为 ...

  2. 这一次搞懂Spring事务是如何传播的

    文章目录 前言 正文 事务切面的调用过程 事务的传播性概念 实例分析 总结 前言 上一篇分析了事务注解的解析过程,本质上是将事务封装为切面加入到AOP的执行链中,因此会调用到MethodIncepto ...

  3. 什么。你还没有搞懂Spring事务增强器 ,一篇文章让你彻底搞懂Spring事务,虽然很长但是干货满满

    上一篇文章主要讲解了事务的Advisor是如何注册进Spring容器的,也讲解了Spring是如何将有配置事务的类配置上事务的,也讲解了Advisor,pointcut验证流程:但是还未提到的那个Ad ...

  4. 一张图搞懂Spring bean的完整生命周期

    一张图搞懂Spring bean的生命周期,从Spring容器启动到容器销毁bean的全过程,包括下面一系列的流程,了解这些流程对我们想在其中任何一个环节怎么操作bean的生成及修饰是非常有帮助的. ...

  5. 五分钟学Java:一篇文章搞懂spring和springMVC

    原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 本文思维导图 什么是Spring,为什么你要学习spring? 你第一次接触spring框架是在什么时候?相信很多人和我一样,第一次了 ...

  6. 五分钟学Java:一篇文章带你搞懂spring全家桶套餐

    原创声明 本文首发于微信公众号[程序员黄小斜] 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 本文思维导图 什么是Spring,为什么你要学习spring? 你第一次接触spring框架是在 ...

  7. 这一次搞懂Spring代理创建及AOP链式调用过程

    文章目录 前言 正文 基本概念 代理对象的创建 小结 AOP链式调用 AOP扩展知识 一.自定义全局拦截器Interceptor 二.循环依赖三级缓存存在的必要性 三.如何在Bean创建之前提前创建代 ...

  8. 就这?一篇文章让你读懂 Spring 事务

    什么是事务 ▲ 百度百科 概括来讲,事务是一个由有限操作集合组成的逻辑单元.事务操作包含两个目的,数据一致以及操作隔离.数据一致是指事务提交时保证事务内的所有操作都成功完成,并且更改永久生效:事务回滚 ...

  9. 一张图彻底搞懂Spring循环依赖

    1 什么是循环依赖? 如下图所示: BeanA类依赖了BeanB类,同时BeanB类又依赖了BeanA类.这种依赖关系形成了一个闭环,我们把这种依赖关系就称之为循环依赖.同理,再如下图的情况: 上图中 ...

随机推荐

  1. &gt&semi;xx&period;hbm&period;xml的一些简单配置

    1.在hibernate-mapping的属性里有一个package,它的意思是以下的类都是在这个包下的,下面写类路径的时候,可以不写包名 2.class标签 name属性指的是类 table属性指的 ...

  2. &lbrack;转&rsqb; Fix&colon; Screen Clipping Shortcut In OneNote Not Working After Upgrading To Windows 8&period;1

    RECOMMENDED: Click here to fix Windows errors and optimize system performance No doubt, OneNote is y ...

  3. HTTP详解&lpar;2&rpar;

    HTTP详解(2)-请求.响应.缓存 分类: 网络知识2013-03-17 16:45 1969人阅读 评论(0) 收藏 举报   目录(?)[+]   1. HTTP请求格式 做过Socket编程的 ...

  4. Ubuntu 12&period;04 下安装 Eclipse

    方法一:(缺点是安装时附加openjdk等大量程序并无法去除,优点是安装简单) $ sudo apt-get install eclipse 方法二:(优点是安装内容清爽,缺点是配置麻烦)1.安装JD ...

  5. Cell

    首先需要创建一个model类,继承于NSObject: 定义两个属性: @property(nonatomic,retain)NSString imageName; @property(nonatom ...

  6. linux内核中默认logo的具体位置

    /driver/logo/... 以下这个目录下对应的是logo的设置

  7. Methods to reduce the number of pipeline stages

    Several techniques have been proposed to reduce the number of pipeline stages. We categorize them in ...

  8. Project facet jst&period;web&period;jstl has not been defined&period;

    Project facet jst.web.jstl has not been defined. 博客分类: Eclipse Project facet  原版:http://blog.csdn.ne ...

  9. 写点C&plus;&plus; 学习记录 充数

    #include "stdafx.h" #include <cstdlib> #include <iostream> using namespace std ...

  10. WPF 简洁的主界面

    用的是dev的TileLayouotControl控件. <dxwui:PageAdornerControl Header="" Padding="30" ...