Spring事务管理.pptx_第1页
Spring事务管理.pptx_第2页
Spring事务管理.pptx_第3页
Spring事务管理.pptx_第4页
Spring事务管理.pptx_第5页
免费预览已结束,剩余63页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

学习创造超越共享,Spring事务管理柳勇光,Spring事务管理大纲,事务基本概念,1.事务必须具备的4个特征,a.原子性(Atomicity).要么成功提交,要么回滚,b.一致性(Consistency).必须保证资源状态的一致性,c.隔离级别(Isolation).在事务执行过程中,其操作资源的状态信息不能够被其他并发事务操作到,d.持久性(Durablity).一旦事务提交,其结果应该是持久的,2.事务类型及其区别,a.局部事务(本地,Local),b.全局事务(全局,Global),c.局部事务与全局事务区别:操作的资源不同。,本地事务,全局事务,事务基本概念,1、问题,非基于Spring事务处理问题,Sessionsession=null;Transactiontransaction=null;trysession=factory.openSession();/开启事务transaction=session.beginTransaction();transation.begin();session.save(user);mit();/提交事务catch(Exceptione)e.printStackTrace();transaction.rollback();/回滚事务returnfalse;finallysession.close();,Connectionconn=DataSourceUtils.getConnection();/开启事务conn.setAutoCommit(false);tryObjectretVal=callback.doInConnection(conn);mit();/提交事务returnretVal;catch(Exceptione)conn.rollback();/回滚事务throwe;finallyconn.close();,缺点:不一致的事务管理,编程复杂,Spring框架提供了一致的事务管理抽象,这带来了以下好处:为复杂的事务API提供了一致的编程模型,如JTA、JDBC、Hibernate、JPA和JDO支持声明式事务管理提供比复杂的事务API(诸如JTA)更简单的、更易于使用的编程式事务管理API非常好地整合Spring的各种数据访问抽象,Spring事务处理,Spring事务抽象的关键是事务策略的概念。这个概念由org.springframework.transaction.PlatformTransactionManager接口定义,Spring没有直接管理事务,而是将管理事务的责任委托给某个特定平台的事务实现。,Spring的事务管理器,Spring的事务管理器,platformTransactionmanager,datasourceTransactionmanager,hibernateTransactionmanager,jdoTransactionmanager,persistenceBrokerTransactionmanager,JTATransactionmanager,jdbc,hibernate,JDO,OJB,JTA,每种事务管理器都充当了对特定平台的事务实现的代理。这样我们就只需要和spring中的事务打交道,而不用关系实际上事务实现是什么样的。要使用一个事务管理器,你得再上下文中声明它。,程序控制事务管理能让你在代码中精确定义事务边界,声明式事务帮助把一个操作从事务规则中分离出来。,2020/5/19,事务的传播方式(1),PROPAGATION_REQUIRED表示业务逻辑方法需要在一个事务中运行,如果该方法在运行时,已经处在一个事务中,则直接加入到该事务中,否则自己创建一个新的事务。即:如果存在一个事务,则支持当前事务。如果没有事务则开启。在实际开发中常用该传播方式。PROPAGATION_SUPPORTS表示业务逻辑方法如果在某个事务范围内被调用,则该方法直接成为当前事务的一部分。如果该方法在事务范围外被调用,则该方法在无事务的环境下执行。即:如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。,2020/5/19,PROPAGATION_MANDATORY表示业务逻辑方法只能在一个已经存在的事务中执行,该方法不能创建自己的事务,如果该方法在没有事务的环境下被调用,容器就会抛出事务不存在的异常。即:如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。PROPAGATION_REQUIRES_NEW表示不管当前是否有事务存在,该业务逻辑方法都会为自己创建一个全新的事务。如果该方法已经运行在一个事务中,则原有事务会被挂起,新的事务会被创建,直到该方法执行结束后新事务才算结束,原先的事务再恢复执行。即:总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起,新事务运行完毕后,再接着运行被挂起的事务。,事务的传播方式(2),2020/5/19,PROPAGATION_NOT_SUPPORTED表示业务逻辑方法不需要事务。如果该方法目前没有关联到某个事务,容器不会为它创建事务。如果该方法在一个事务中被调用,则该事务会被挂起,在方法调用结束后原先的事务才会恢复执行。即:总是非事务地执行,并挂起任何存在的事务,当前方法运行完毕后,被挂起的事务才恢复执行。,事务的传播方式(3),2020/5/19,PROPAGATION_NEVER表示业务逻辑方法绝对不能在事务范围内执行。如果该方法在某个事务中执行,容器会抛出异常,只有没有关联到任何事务时该方法才能正常执行。即:总是非事务地执行,如果存在一个活动事务,则抛出异常。,事务的传播方式(4),2020/5/19,PROPAGATION_NESTED表示如果一个活动的事务存在,业务逻辑方法则运行在一个嵌套的事务中,如果没有活动事务,则按REQUIRED属性执行。它使用了一个单独的事务,这个事务拥有多个可以回滚的保存点,内部事务的回滚不会对外部事务造成影响,它只对DataSourceTransactionManager事务管理器生效。即:如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务,则按TransactionDefinition.PROPAGATION_REQUIRED属性执行。,事务的传播方式(5),事务的传播方式,传播规则回答了一个问题,就是新的事务是否要被启动或是挂起,或者方法是否要在事务环境中运行。,事务的传播方式,2020/5/19,事务播放方式图示说明,隔离级别几个概念脏读:一个事务读取了另一个事务改写但还未提交的数据,如果这些数据被回滚,则读到的数据是无效的。不可重复读:一个事务执行相同的查询两次或两次以上,但每次查询结果都不同。幻读:一个事务读取了几行记录后,另一个事务插入一些记录,幻读就发生了。再后来的查询中,第一个事务就会发现有些原来没有的记录。,事务隔离级别(1),隔离级别,事务隔离级别(2),2020/5/19,Spring中事务隔离级别(1),ISOLATION_DEFAULT这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.以下四个与JDBC的隔离级别相对应ISOLATION_READ_UNCOMMITTED这是事务最低的隔离级别,它充许另外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读、不可重复读和幻像读。ISOLATION_READ_COMMITTED保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。,2020/5/19,ISOLATION_REPEATABLE_READ这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生,即:不可重复读。ISOLATION_SERIALIZABLE这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读、不可重复读外,还避免了幻像读。但是并发性最差。,Spring中事务隔离级别(2),只读若对数据库只进行读操作,可设置事务只读的属性,使用某些优化措施。数据库会进行优化处理。若使用hibernate作为持久化机制,声明一个只读事务会使hibernate的flush模式设置为FLUSH_NEVER。避免不必要的数据同步,将所有更新延迟到事务的结束。,事务只读属性,事务超时若事务在长时间的运行,会不必要的占用数据库资源。设置超时后,会在指定的时间片回滚。将那些具有可能启动新事务的传播行为的方法的事务设置超时才有意义(PROPAGATION_REQUIRED,PROPAGATION_REQUIRES_NEW,PROPAGATION_NESTED)。,事务超时,2020/5/19,Spring事务管理的两种方式,在Spring中实现事务管理有两种方式,一种是传统的编程式事务管理,也就是程序员在编写程序代码实现事务的管理,具体包括定义事务的开始、在程序异常时进行事务的回滚及程序正常执行后的事务提交。另一种则是基于AOP技术实现的声明式事务管理,事务管理本身是一项共有的系统级服务功能,完全可以将事务管理抽象成一个事务切面,程序员不再关心事务管理的问题,把主要精力放在核心业务逻辑代码的编写上,然后在需要进行事务管理的方法上切入事务切面,使之具有事务管理的功能,达到事务管理的目的。,Spring事务管理大纲,Spring编程式事务管理,Spring事务处理核心类:TransactionDefinition:事务属性定义,描述了事务的隔离级别,超时时间,事务是否只读,传播规则等等;TranscationStatus:描述事务的状态,代表了当前的事务,可以提交,回滚PlatformTransactionManager:事务管理器接口,只定义了3个方法:getTransaction()获取事务的状态;commit();rollback();事务管理器的实现类有多种,根据具体的持久层框架的不同而不同;事务管理器实现类:DataSourceTransactionManager、HiberNateTransactionManager、JdoTransactionManager等,publicinterfacePlatformTransactionManagerTransactionStatusgetTransaction(TransactionDefinitiondefinition)throwsTransactionException;voidcommit(TransactionStatusstatus)throwsTransactionException;voidrollback(TransactionStatusstatus)throwsTransactionException;,PlatformTransactionManager接口,TransactionDefinition接口1:事务隔离:当前事务和其它事务的隔离的程度。例如,这个事务能否看到其他事务未提交的写数据?2:事务传播:通常在一个事务中执行的所有代码都会在这个事务中运行。但是,如果一个事务上下文已经存在,有几个选项可以指定一个事务性方法的执行行为:例如,简单地在现有的事务中继续运行(大多数情况);或者挂起现有事务,创建一个新的事务。Spring提供EJBCMT中常见的事务传播选项。3:事务超时:事务在超时前能运行多久(自动被底层的事务基础设施回滚)。4:只读状态:只读事务不修改任何数据。只读事务在某些情况下(例如当使用Hibernate时),是一种非常有用的优化。,TransactionDefinition/获得事务状态TransactionStatusts=transactionManager.getTransaction(td);try/dosthtransactionMmit(ts);catch(Exceptione)transactionManager.rollback(ts);,/3.获取事务管理器PlatformTransactionManagertxManager=(PlatformTransactionManager)ctx.getBean(txManager);/4.定义事务属性DefaultTransactionDefinitiontd=newDefaultTransactionDefinition();td.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);/5开启事务,得到事务状态TransactionStatusstatus=txManager.getTransaction(td);try/6.执行数据库操作System.out.println(jdbcTempate.queryForInt(selectcount(*)fromtbl_doc);/7、提交事务txMmit(status);catch(Exceptione)/7、回滚事务txManager.rollback(status);,直接使用PlatformTransactionManager,使用TransactionTemplate管理事务TransactionTempale采用和其他Spring模板,如JdbcTempalte和HibernateTemplate一样的方法。它使用回调方法,把应用程序从处理取得和释放资源中解脱出来。如同其他模板,TransactionTemplate是线程安全的。代码片段:TransactionTemplatett=newTransactionTemplate();Objectresult=tt.execute(newTransactionCallback().publicObjectdoTransaction(TransactionStatusstatus)./dosthreturnnull;);使用TransactionCallback()可以返回一个值。如果使用TransactionCallbackWithoutResult则没有返回值。TransactionCallbackWithoutResult执行事务没有返回值,例如save、update、delete等等;TransactionCallback执行事务处理后有返回值,如find要返回结果集(List);,使用TransactionTemplate管理事务,/3.获取事务管理器PlatformTransactionManagertxManager=(PlatformTransactionManager)ctx.getBean(txManager);/4、定义事务管理的模板TransactionTemplatetransactionTemplate=newTransactionTemplate(txManager);/5.定义事务属性transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);/6.回调,执行真正的数据库操作,如果需要返回值需要在回调里返回transactionTemplate.execute(newTransactionCallback()OverridepublicObjectdoInTransaction(TransactionStatusstatus)/7.执行数据库操作System.out.println(jdbcTempate.queryForInt(selectcount(*)fromtbl_doc);returnnull;);,使用TransactionTemplate管理事务,2020/5/19,编程式事务示例,下面以Hibernate为例,来考查一下在实际开发中如何使用编程式事务来开发项目。示例:1、建立两个实体:User和Log(用户和日志)2、要求:在保存用户时自动保存一份日志分析:完成上述功能,就涉及到对两张表的保存,要么全成功,要么全失败,为了能够达到这样的要求,因此必须采用事务来进行控制。,2020/5/19,使用编程式事务,在Hibernate中获取Session的方法需要使用如下方式才能保证对于同一个线程不同的表的操作才能在一个事务下控制:在hibernate.cfg.xml文件中加入:thread说明:表示使用的是本地事务(jdbc事务),2020/5/19,获取Session的方法的改进获取Session时必须采用:getCurrentSession()说明:获取的Session就会绑定到当前线程中,这样再保存其它实体对象的时候就保证了也在同一事务下操作(因为是在同一个线程中),同时当提交事务或回滚事务后,Session会自动关闭,不用人为再进行关闭。,2020/5/19,示例代码:,UserManagerImpl类代码:publicvoidaddUser(Useruser)Sessionsession=null;try/session=HibernateUtils.getSession();session=HibernateUtils.getSessionFactory().getCurrentSession();session.beginTransaction();session.save(user);/保存日志Loglog=newLog();log.setType(安全日志);log.setDetail(xxx进入系统);log.setDate(newDate();LogManagerImpllogManager=newLogManagerImpl();logManager.addLog(log);session.getTransaction().commit();catch(Exceptione)e.printStackTrace();session.getTransaction().rollback();,2020/5/19,LogManagerImplpublicvoidaddLog(Loglog)HibernateUtils.getSessionFactory().getCurrentSession().save(log);,2020/5/19,说明:thread当设置完该属性后,Hibernate会将获取到的Session绑定到当前线程中,这样再调用getCurrentSession()方法获取Session时,该方法首先查看当前线程中有没有Session对象,如果没有,则从SessionFactory中获取Session对象并把该Session对象绑定到当前线程中,如果当前线程中有Session对象,该方法则直接从当前线程中取出Session对象直接使用,这样就保证了在同一个线程请求中,不管操作多少个实体对象使用的都是同一个Session对象,只要Session对象打开了事务,那么这些不同的实体对象的操作都处于同一个事务控制之下(因为这些实体对象使用的是同一个Session)。,2020/5/19,编程式事务小结,编程式能灵活控制事务边界,但编程复杂需要在hibernate.cfg.xml文件中加入如下配置:如果使用的是本地事务(jdbc事务)thread如果使用的是全局事务(jta事务)jta获取Session时需要使用getCurrentSession(),采用getCurrentSession()创建的session会绑定到当前线程中,而采用openSession()创建的session则不会。采用getCurrentSession()创建的session在commit或rollback时会自动关闭,而采用openSession()创建的session必须手动关闭,Spring事务管理大纲,2020/5/19,声明式事务,Spring为声明式事务提供了简单而强大的支持,所谓声明式事务,是指在Spring的配置文件中使用相应的标签对事务进行配置,这样做的好处是Spring可以帮助我们管理事务,例如:什么时候提交事务、什么时候回滚事务等。从开发效率与易维护的角度来看,Spring声明式事务管理是实际开发中比较常用的。,41,AOP(AspectOrientedProgramming)它是一种设计模式,用于实现一个系统中的某一个方面的应用。AOP的应用系统安全事务日志审计,AOP简介,42,AOP的术语描述了AOP编程的各个方面:切面(Aspect)描述的是一个应用系统的某一个方面或领域,例如:日志,事务,权限检查等。连接点(Joinpoint)连接点是应用程序执行过程中插入切面的点,这些点可能是方法的调用,异常抛出或字段的修改等。通知(Advise)通知它是切面的具体实现,它表示切面的行为,例如在日志的切面应用中,日志通知包含了实现日志功能的具体代码,例如向日志文件写入日志信息等。,AOP术语,43,切入点(Pointcut)切入点指定了通知应当应用在那些连接点上,通知可以应用到AOP框架支持的任何的连接点,例如:根据方法名来确定切入点等,它指定了那些连接点需要被通知。引入(Introduction)引入充许你为已存在的类添加新的方法和属性。目标对象(Target):目标对象是指被通知的对象,它是一个普通的业务对象,如果没有AOP那么它其中可能包含大量的非核心业务逻辑代码,例如日志,事务等,而如果使用了AOP则其中只有核心的业务逻辑代码。,AOP术语,44,代理(Proxy)代理是指将通知应用到目标对象后形成的新的对象。它实现了与目标对象一样的功能,不同的是它添加了通知的应用功能例如日志,事务等,对用户而言它与目标对象是一样的。织入(Weaving)织入是指将切面应用到目标对象从而建立一个新的代理对象的过程,切面在指定的接入点被织入目标对象中,织入一般可发生在对象的编译期,类装载期或运行期,Spring的AOP采用的是运行期织入。,AOP术语,45,SpringAOP,Spring的连接点模型是建立在方法拦截的基础之上。Spring在方法调用的各个地方可织入通知,Spring有提供多种类型的通知,它们分别提供了不同的织入方式,46,SpringAop的实现,Spring中建立AOP应用的基本步骤建立目标类及业务接口Spring中注册目标类实例建立通知类实现具体的通知接口Spring中注册通知类实例配置目标类的代理对象(织入通知形成代理对象)获取代理对象,调用其中的业务方法,声明式事务的实施步骤1、定义(资源)DataSource/SessionFactory2、定义事务管理器(管理资源的事务)3、定义事务通知:定义了如何实施事务(实施事务的方法名和对应的事务属性),需要使用事务管理器管理事务,定义了如何选择目标对象的方法及实施的事务属性4、定义advisor(切入点和事务通知):切入点选择需要实施事务的目标对象(一定是业务逻辑层)5、Spring织入事务通知到目标对象(AOP代理),声明式事务的实施步骤,实施事务的步骤1、定义DataSource2、定义事务管理器3、定义事务通知:定义了如何实施事务(实施事务的方法名和对应的事务属性),需要使用事务管理器管理事务,定义了如何选择目标对象的方法及实施的事务属性4、定义advisor(切入点和事务通知):切入点选择需要实施事务的目标对象(一定是业务逻辑层)5、Spring织入事务通知到目标对象(AOP代理),声明式事务,声明式事务,Spring事务管理器,声明式事务,事务advice,声明式事务-事务advice,事务的AOP配置,JDBC事务:,在幕后,DataSourceTransactionManager通过调用从DataSource得到的Connection对象来管理事务。如:conn.rollback()mit(),Hibernate事务:其中sessionFactory属性必须和一个Hibernate的SessionFactory绑定HibernateTransacti

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论