今天介绍一下Spring事物不生效的场景,事物是我们在项目中经常使用的,如果是Java的话,基本上都使用Spring的事物,不过Spring的事物如果使用不当,那么就会导致事物失效或者不回滚,最终导致数据不一致,所以很有必要去研究一下Spring事物不生效的一些场景,避免掉坑。
事务是一个非常重要的知识点,前面的文章已经有介绍了关于SpringAOP代理的实现过程;事务管理也是AOP的一个重要的功能。
事物是区分文件存储系统与Nosql数据库重要特性之一,其存在的意义是为了保证即使在并发情况下也能正确的执行crud操作。怎样才算是正确的呢?这时提出了事物需要保证的四个特性即ACID:
A系统调用B系统,B系统又调用了C系统,他们都操作了各自的数据库,如何保证事物一致?
在 Spring Batch(1)——数据批处理概念 文中介绍了批处理的概念以及Spring Batch相关的使用场景,后续将会陆续说明在代码层面如何使用。
@Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。
上一章只是解决了单事物问题,也就是说同时只能使用自己的数据源,并指定事物管理,才能使用,那么如果同时使用多个数据源,就会产生分布式事物问题
REQUIRED 如果有事务在运行,当前的方法就在这个内运行,否则,就启动另一个事务,并在自己的事务内运行。
最近在做一个项目,这个项目很有特点——它是一个分布式项目但是它却未使用分布式事物。我分析其事物机制和缺陷时,突然灵感一来,于是有了这篇文章。
在上一篇中我们已经通过了动态代理技术实现了简单的AOP功能,但是如果我们细心观察就会发现,通过上一篇中的方式实现有,几点明显需要改进的地方,它们分别是:
在MyBatis架构中SqlSession是提供给外层调用的顶层接口,实现类有:DefaultSqlSession、SqlSessionManager以及mybatis-spring提供的实现SqlSessionTemplate。默认的实现类为DefaultSqlSession如。类图结构如下所示:
在使用 SpringMVC 的时候一般需要我们配置开启事务管理器,boot 中为何不用开启 @EnableTransactionManagement? 直接使用 @Transactional 就可以了
批处理任务的主要业务逻辑都是在Step中去完成的。可以将Job理解为运行Step的框架,而Step理解为业务功能。
value这里主要用来指定不同的事务管理器;主要用来满足在同一个系统中,存在不同的事务管理器。比如在Spring中,声明了两种事务管理器txManager1, txManager2.
在上几篇中本人基本已经将IOC容器涉及到的知识全部介绍完了,从今天起我们学习一下spring中的另一个非常重要的技术AOP。AOP并不是spring中所独创的技术,因为AOP可以理解为是一种编程思想,例如OOP(面向对象编程)一样。只是最近它才被作为一项技术真正的用于软件开发中的。那么到底什么是AOP呢?AOP的全称为Aspect Oriented Programing。看翻译我们基本就可以猜出AOP的名字了,也就就是我们常常听说的面象切面编程。我们通过下面的例子来展示AOP到底能够解决我的方法中的什么问题?
来源:博客园-大新博客 链接:http://www.cnblogs.com/daxin/p/3544188.html(点击文末阅读原文前往) 在使用Mybatis与Spring集成的时候我们用到了 SqlSessionTemplate 这个类。 <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactor
主要记录下spring是如何支持事物的,以及在Spring结合mybatis时,可以怎么简单的实现数据库的事物功能
通过上面对事物的说明,有编程经验的人应该都很清楚为什么需要失误了吧?那就是为了防止出现业务逻辑上的出错,如算错账转错钱等。
在与一位面试官沟通的时候, 我问了一个问题, 技术更新如此的快, 您是如何知道当前市场上流行的技术或者框架? 如何才能不断的更新自己的知识库呢? 他说, 无论你是否想要换工作, 都准备好, 每年来
下面列举了一些使用Spring框架带来的主要好处: Dependency Injection(DI) 方法使得构造器和JavaBean properties文件中的依赖关系一目了然。 与EJB容器相比较,IoC容器更加趋向于轻量级。这样一来IoC容器在有限的内存和CPU资源的情况下进行应用程序的开发和发布就变得十分有利。 Spring并没有闭门造车,Spring利用了已有的技术比如ORM框架、logging框架、J2EE、Quartz和JDK Timer,以及其他视图技术。 Spring框架是按照模块的形
最近做项目遇到了一个很奇怪的问题,大致的业务场景是这样的:我们首先设定两个事务,事务parent和事务child,在Controller里边同时调用这两个方法,示例代码如下:
1)支持当前事物 —— PROPAGATION_REQUIRED:如果当前没有事物,就新建一个事务;如果有事物,就直接使用当前前事物、
Spring事务管理的本质就是封装了数据库对事务支持的操作,使用JDBC的事务管理机制,就是利用java.sql.Connection对象完成对事务的提交和回滚。
以前写了几篇关于SpringBoot的文章《面试高频题:springBoot自动装配的原理你能说出来吗》、《保姆级教程,手把手教你实现一个SpringBoot的starter》,这几天突然有个读者问:能说一说Spring的父子容器吗?说实话这其实也是Spring八股文里面一个比较常见的问题。在我的印象里面Spring就是父容器,SpringMvc就是子容器,子容器可以访问父容器的内容,父容器不能访问子容器的东西。有点类似java里面的继承的味道,子类可以继承父类共有方法和变量,可以访问它们,父类不可以访问子类的方法和变量。在这里就会衍生出几个比较经典的问题:
在单体架构的秒杀活动中,为了减轻DB层的压力,这里我们采用了Lock锁来实现秒杀用户排队抢购。然而很不幸的是尽管使用了锁,但是测试过程中仍然会超卖,执行了N多次发现依然有问题。输出一下代码吧,可能大家看的比较真切:
如清晰度低,可转PC网页观看高清版本: http://v.qq.com/x/page/g0568hww5e2.html Spring+Hibernate整合 结构图: 整合步骤: 1:导包 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>4.3.7.RELEASE</version> </dependenc
5.Spring并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部
初看起来,上来就是一大堆的术语,而且还有个拉风的名字,面向切面编程,都说是OOP的一种有益补充等等。一下让你不知所措,心想着:管不得很多人都和我说AOP多难多难。当我看进去以后,我才行发现:他就是一些Java基础上的朴实无华的应用,包括IOC(见《Spring IOC(依赖注入、控制反转)概念理解》),包括许许多多这样的名词,都是万变不离其宗而已。
首先在编写Service层代码前,我们应该首先要知道这一层到底时干什么的,这里摘取来自ITEYE一位博主的原话
A.Student对象中一定有一个dept属性,并且赋值了一个字符串department
最近在写一个管理台页面,是从页面提交多个form到controller层的,这些form要么都能提交成功,要么都失败。controller层需要进行事物处理,于是简单的加了@Transactional注解,测试的时候,我故意把最后一个表单的某个字段长度设置超长,后台肯定会报data too long exception。代码主体简要如下:
我们看看 Spring 中的事务处理的代码,使用 Spring 管理事务有声明式和编程式两种方式,声明式事务处理通过 AOP 的实现把事物管理代码作为方面封装来横向插入到业务代码中,使得事务管理代码和业务代码解藕。在这种方式我们结合 IoC 容器和 Spirng 已有的FactoryBean 来对事务管理进行属性配置,比如传播行为,隔离级别等。其中最简单的方式就是通过配置 TransactionProxyFactoryBean来实现声明式事物;在整个源代码分析中,我们可以大致可以看到 Spring 实现声明式事物管理有这么几个部分:
Spring 是一个开源框架,为简化企业级应用开发而生。Spring 可以是使简单的 JavaBean 实现以前只有 EJB 才能 实现的功能。Spring 是一个 IOC 和 AOP 容器框架。 Spring 容器的主要核心是: 控制反转(IOC),传统的 java 开发模式中,当需要一个对象时,我们会自己使用 new 或者 getInstance 等直接 或者间接调用构造方法创建一个对象。而在 spring 开发模式中,spring 容器使用了工厂模式为我们创建了所需要的对 象,不需要我们自己创建了,直接调用 spring 提供的对象就可以了,这是控制反转的思想。 依赖注入(DI),spring 使用 javaBean 对象的 set 方法或者带参数的构造方法为我们在创建所需对象时将其属 性自动设置所需要的值的过程,就是依赖注入的思想。 面向切面编程(AOP),在面向对象编程(oop)思想中,我们将事物纵向抽成一个个的对象。而在面向切面编程 中,我们将一个个的对象某些类似的方面横向抽成一个切面,对这个切面进行一些如权限控制、事物管理,记录日志等 公用操作处理的过程就是面向切面编程的思想。AOP 底层是动态代理,如果是接口采用 JDK 动态代理,如果是类采用 CGLIB 方式实现动态代理。
Propagation 就是支持的事物传播类型了,定义了 7 个枚举,下面分别来讲解
初看aop,上来就是一大堆术语,而且还有个拉风的名字,面向切面编程,都说是OOP的一种有益补充等等。一下子让你不知所措,心想着:怪不得很多人都和我说aop多难多难。当我看进去以后,我才发现:它就是一些java基础上的朴实无华的应用,包括ioc,包括许许多多这样的名词,都是万变不离其宗而已。
依赖的时候,框架会自动默认分别注入DataSourceTransactionManager或JpaTransactionManager。所以我们不需要任何额外 配置就可以用@Transactional注解进行事务的使用。
声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
时运不济,才到16年10月份,公司资金紧张,不得已又出去面试,面试了大概四家公司,只有一家offer ,被打击的体无完肤。 多说无益,下面是面试中提到的面试题和我的个人解答
事物管理对于企业应用来说是至关重要的,好使出现异常情况,它也可以保证数据的一致性。
Spring核心知识 Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由Rod Johnson在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为J2EE应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架。 为什么说Spring是一个一站式的轻量级开源框架呢?EE开发可分成三层架构,针对JavaEE的三层结构,每一层Spring都提供了不同的解决技术。 • WEB层:SpringMVC • 业务层:Spring的IoC • 持久层:Spring的JDBCTemplate(Spring的JDBC模板,ORM模板用于整合其他的持久层框架) 从上面的简要介绍中,我们要知道Spring的核心有两部分: • IoC:控制反转。 举例来说,在之前的操作中,比方说有一个类,我们想要调用类里面的方法(不是静态方法),就要创建类的对象,使用对象调用方法实现。对于Spring来说,Spring创建对象的过程,不是在代码里面实现的,而是交给Spring来进行配置实现的。 AOP:面向切面编程。
前序文章陆续介绍了批处理的基本概念,Job使用、Step控制、Item的结构以及扁平文件的读写。本文将接着前面的内容说明数据库如何进行批处理读写。
大年初七好,今天大部分码农同学已经上班了吧,最近也是跳槽人才流动的高峰期,拿了年终奖,找找更好的机会。 小编也面了几家公司了,回来整理下面经分享给大家做个参考。有很多,暂时先分享20道,后续更多会陆续整理分享出来。 1.Mybatis与Ibatis的区别 2.Http1与Http2的区别 3.SpringMVC的执行流程 4.JVM内存溢出具体指哪些内存区域?都会抛出什么异常? 5.谈谈对AJAX的理解 6.谈谈对事务的理解 7.String能被继承吗?为什么? 8.谈谈继承和聚合 9.什么是深拷贝
系统架构 一个成功的项目离不开一个好的架构,一个好的架构自然需要一位好的设计师, Rod Johnson正是Spring的前生总架构设计师,那么spring有哪些模块,我们看一下由s
问:把大象放冰箱里,分几步? 答:三步啊,第一、把冰箱门打开,第二、把大象放进去,第三、把冰箱门带上。 问:实现Spring事务,分几步? 答:三步啊,第一、找出需要事务的方法,第二、把事务加进去,第三、执行事务。 You may find it's not a joke, it's serious。
多数有经验的程序开发者都应该听说过DDD,并且尝试过将其应用在自己的项目中。不知你是否遇到过这样的场景:你创建了一个资源库(Repository),但一段时间之后发现这个资源库和传统的DAO越来越像了,你开始反思自己的实现方式是正确的吗?或者,你创建了一个聚合,然后发现这个聚合是如此的庞大,它为什么引用了如此多的对象,难道又是我做错了吗?
如果对AOP的实现不太熟悉的话可以看我之前的文章,或者到我网站www.javashitang.com上查看系列文章
领取专属 10元无门槛券
手把手带您无忧上云