Spring学习(三)

1,Spring的事务管理机制

Spring事务管理高层抽象主要包括3个接口,Spring的事务主要是由他们共同完成的:

l PlatformTransactionManager:事务管理器—主要用于平台相关事务的管理

l TransactionDefinition: 事务定义信息(隔离、传播、超时、只读)—通过配置如何进行事务管理。

l TransactionStatus:事务具体运行状态—事务管理过程中,每个时间点事务的状态信息。

2, PlatformTransactionManager事务管理器

l DataSourceTransactionManager针对JdbcTemplate、MyBatis 事务控制 ,使用Connection(连接)进行事务控制 :

开启事务 connection.setAutoCommit(false);

提交事务 connection.commit();

回滚事务 connection.rollback();

l HibernateTransactionManager针对Hibernate框架进行事务管理, 使用Session的Transaction相关操作进行事务控制 :

开启事务 session.beginTransaction();

提交事务 session.getTransaction().commit();

回滚事务 session.getTransaction().rollback();

事务管理器的选择?

用户根据选择和使用的持久层技术,来选择对应的事务管理器

3,TransactionDefinition事务定义信息

该接口主要提供的方法:

l getIsolationLevel:隔离级别获取

l getPropagationBehavior:传播行为获取

l getTimeout:获取超时时间(事务的有效期)

l isReadOnly 是否只读(保存、更新、删除—对数据进行操作-变成可读写的,查询-设置这个属性为true,只能读不能写),事务管理器能够根据这个返回值进行优化。

这些事务的定义信息,都可以在配置文件中配置和定制。

4, 事务的隔离级别IsolationLevel

隔离级别


含义


DEFAULT


使用后端数据库默认的隔离级别(spring中的的选择项)


READ_UNCOMMITED


允许你读取还未提交的改变了的数据。可能导致脏、幻、不可重复读


READ_COMMITTED


允许在并发事务已经提交后读取。可防止脏读,但幻读和 不可重复读仍可发生


REPEATABLE_READ


对相同字段的多次读取是一致的,除非数据被事务本身改变。可防止脏、不可重复读,但幻读仍可能发生。


SERIALIZABLE


完全服从ACID的隔离级别,确保不发生脏、幻、不可重复读。这在所有的隔离级别中是最慢的,它是典型的通过完全锁定在事务中涉及的数据表来完成的。

脏读:一个事务读取了另一个事务改写但还未提交的数据,如果这些数据被回滚,则读到的数据是无效的。

不可重复读:在同一事务中,多次读取同一数据返回的结果有所不同。换句话说就是,后续读取可以读到另一事务已提交的更新数据。相反,“可重复读”在同一事务中多次读取数据时,能够保证所读数据一样,也就是,后续读取不能读到另一事务已提交的更新数据。

幻读:一个事务读取了几行记录后,另一个事务插入一些记录,幻读就发生了。再后来的查询中,第一个事务就会发现有些原来没有的记录。

事务四大特性 ACID ---隔离性引发问题 ---- 解决事务的隔离问题 隔离级别

Mysql 默认隔离级别 REPEATABLE_READ

Oracle 默认隔离级别 READ_COMMITTED

5, 事务的传播行为PropagationBehavior

什么是事务的传播行为? 有什么作用?

事务传播行为用于解决两个被事务管理的方法互相调用问题

业务层两个方法面临的事务问题:

* 有些时候需要处于同一个事务(删除用户删除完成之后,需要同时删除用户对应的订单,需要事务回滚,例如商场工作人员删除订单业务),

* 有些时候不能在同一个事务(取款是一个事务操作,打印凭条是一个事务操作,例如ATM取款业务) !

事务的传播行为的7种类型:

Propagation


事务传播行为类型


说明


PROPAGATION_REQUIRED


支持当前事务,如果不存在 就新建一个


PROPAGATION_SUPPORTS


支持当前事务,如果不存在,就不使用事务


PROPAGATION_MANDATORY


支持当前事务,如果不存在,抛出异常


PROPAGATION_REQUIRES_NEW


如果有事务存在,挂起当前事务,创建一个新的事务


PROPAGATION_NOT_SUPPORTED


以非事务方式运行,如果有事务存在,挂起当前事务


PROPAGATION_NEVER


以非事务方式运行,如果有事务存在,抛出异常


PROPAGATION_NESTED


如果当前事务存在,则嵌套事务执行

只对DataSourceTransactionManager 起效

主要分为三大类:

//开启事务

fooa()

//提交事务

//开启事务

foob ()

//提交事务

【面试题】REQUIRED、REQUIRES_NEW、NESTED 区分

REQUIRED:只有一个事务(默认,推荐)

REQUIRES_NEW:存在两个事务 ,如果事务存在,挂起事务,重新又开启了一个新的事务

NESTED 嵌套事务,事务可以设置保存点,回滚到保存点 ,选择提交或者回滚,

6,Spring事务管理的两种方式

Spring支持两种方式事务管理:

一,编程式的事务管理

通过TransactionTemplate手动管理事务

二:使用XML或注解配置声明式事务

Spring的声明式事务是通过AOP实现的(环绕通知),开发中经常使用(代码侵入性最小)推荐使用!!

XML配置方式添加事务管理(tx、aop元素)

操作思路:

1,确定目标:需要对接口中的某个方法,配置切入点

2,需要Advice(环绕通知),方法前开启事务,方法后提交关闭事务

3,配置切入点和切面

配置Advice通知:

方案一(了解):Spring提供了Around通知类TransactionInterceptor。用来增强bean,spring帮我们写好了一个增强类

可以配置为:

<bean id=”transactionInterceptor” class=”org.springframework.transaction.interceptor.TransactionInterceptor”>

方案二(掌握):但Spring为简化事务的配置,提供了<tx:advice>来代替上面的配置,也可以理解为该标签是spring为你实现好了的事务的通知增强方案。

com.springsource.org.aopalliance-1.0.0.jar:aop切面编程

com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar:注解开发切面

spring-aop-3.2.0.RELEASE.jar:aop切面编程

spring-aspects-3.2.0.RELEASE.jar:注解开发切面

spring-tx-3.2.0.RELEASE.jar:事务处理

XML配置方式和注解配置方式 进行事务管理 哪种用的多?

XML方式,集中式维护,统一放置到applicationContext.xml文件中,缺点在于配置文件中的内容太多。

使用@Transactional注解进行事务管理,配置太分散,使用XML进行事务管理,属性集中配置,便于管理和维护

时间: 2024-10-10 00:54:44

Spring学习(三)的相关文章

spring学习(三) ———— spring事务操作

前面一篇博文讲解了什么是AOP.学会了写AOP的实现,但是并没有实际运用起来,这一篇博文就算是对AOP技术应用的进阶把,重点是事务的处理. --wh 一.jdbcTemplate 什么是JdbcTemplate? spring提供用于操作数据库模版,类似Dbutils,通俗点讲,我们操作数据库,spring也会帮我们提供一个操作数据库的工具供我们使用,而不用我们自己手动编写连接数据库,获取结果集等等操作,这个工具就是JdbcTemplate.跟Dbutils一样,想要使用JdbcTemplate

Spring学习(三)

今天学习的是Spring中一个bean引用另一个bean,需要更改的只是xml配置文件中的代码,具体代码如下: 实体类User: public class User { private String name; private UserService userService; public String getName() { return name; } public void setName(String name) { this.name = name; } public UserServ

Spring学习三、Spring配置与DI依赖注入

五.Spring配置 5.1别名 <!-- 别名--> <alias name="user" alias="user2"/> 5.2 Bean的配置 <!-- id : bean的唯一标识符,相当于对象名 class : 全限定名 包名 + 类名 name : 也是别名,name可以同时起多个别名 --> <bean id="userT" class="cn.imut.pojo.User&quo

spring学习三

1: Spring的IOC容器: IOC容器为管理对象之间的依赖关系提供了基础功能. A:BeanFactory: B:ApplicationContext(继承自BeanFactory,功能更多): 有3个实现类:  ClassPathXmlApplicationContext :  classpath是指 WEB-INF文件夹下的classes目录 . FileSystemXmlApplicationContext: 用绝对路径找,不推荐.  XmlWebApplicationContext

spring学习 三 框架的搭建

1 导入jar包 spring启来最少要5个包,四个核心包和一个依赖的日志包 2 创建配置文件 在dynamic web project下的src目录下,创建一个spring的xml配置文件,名称可以任意,但是一般建议命名为applicationContext.xml.  applicationContext.xml配置文件是基于she ma约束的. shema约束与DTD约束一样,都是xml语法检查器. 在老版本的spring中,采用的spring容器接口是BeanFactory,  在新的版

Spring学习笔记(三)

Spring学习笔记(三) AOP 一.使用Annotation方式实现AOP.步骤: xml里加入配置:<aop:aspectj-autoproxy /> <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org

Spring学习系列之——第三章:Spring中Bean的配置(一)

Spring的配置形式有两种:基于XML配置和基于注解配置. Bean的配置方式有以下几种: 通过全类名,即通过反射的方式: 通过工厂方法,有静态工厂方法和实例工厂方法: 通过FactoryBean配置: 通过XML文件配置bean 本篇文章将按照下面的目录来说明基于XML的方式配置bean JavaBean的创建 通过XML配置的方式来配置bean XMLbean的配置: spring的依赖注入的方式 属性注入 构造器注入 工厂方法注入(很少使用) 测试方法 IoC容器的实例化: Applic

不错的Spring学习笔记(转)

Spring学习笔记(1)----简单的实例 ---------------------------------   首先需要准备Spring包,可从官方网站上下载.   下载解压后,必须的两个包是spring.jar和commons-logging.jar.此外为了便于测试加入了JUnit包.   在Myeclipse中创建Java项目.   编写一个接口类,为了简单,只加入了一个方法.   Java代码   1.package com.szy.spring.interfacebean;  

Spring学习(一)tomcat加载web.xml、以及项目集成Spring支持

tomcat容器加载web.xml 一. 1 .启动一个 WEB 项目的时候, WEB 容器会去读取它的配置文件 web.xml ,读取 <listener> 和 <context-param> 两个结点. 2 .紧急着,容创建一个 ServletContext ( servlet 上下文),这个 web 项目的所有部分都将共享这个上下文. 3 .容器将 <context-param> 转换为键值对,并交给 servletContext . 4 .容器创建 <li

Spring学习之Ioc控制反转(1)

开始之前: 1. 本博文为原创,转载请注明出处 2. 作者非计算机科班出身,如有错误,请多指正 ---------------------------------------------------------------------------开始啦啦啦啦啦------------------------------------------------------------------------------- 从开始接触spring起,听到最多的就是Ioc(控制反转)和AOP(面向切面编程