




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Spring高级事务管理难点剖析1-1:DAO和事务管理的牵绊 问题:问题: 很少使用Spring但不使用Spring事务管理器的应用,因此常常有人会问:是否用了Spring,就一定要用Spring事务管理器,否则就无法进行数据的持久化操作呢?事务管理器和DAO是什么关系呢?1-2:DAO和事务管理的牵绊 真相:真相: 答案当然是否定的!我们都知道:事务管理是保证数据操作的事务性(即原子性,一致性,隔离性,持久性,也即所谓的ACID),脱离了事务性,DAO照样可以顺利地进行数据的操作。2-1:应用分层的迷惑 问题:问题: Web,Service及DAO三层划分就像西方国家的立法、行政、司法三权
2、分立一样被奉为金科玉律,是否要使用Spring的事务管理就一定先要进行三层的划分呢?是否每一层都需要有接口+实现类呢?2-2:应用分层的迷惑 真相:真相: 应用代码分层和Spring的事务管理是两回事,没有应用分层照样可以进行Spring事务管理。Spring的事务管理也不依赖于接口+实现类的开发模式。3-1:事务方法嵌套调用的迷茫 问题:问题: 一个事务方法调用另一个事务方法会产生两个事务,还是只有一个事务?3-2 认识TransactionDefinitionlint getPropagationBehavior():事务的传播行为lint getIsolationLevel():事务的隔
3、离级别lint getTimeout():事务的过期时间lboolean isReadOnly():事务的读写特性。很明显,除了事务的传播行为外,事务的其它特性Spring是借助底层资源的功能来完成的,Spring无非只充当个代理的角色。但是事务的传播行为却是Spring凭借自身的框架提供的功能3-3 Spring事务传播行为lPROPAGATION_REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。lPROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。lPROPAGATION_MANDAT
4、ORY:使用当前的事务,如果当前没有事务,就抛出异常。lPROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。lPROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。lPROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。lPROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。所谓事务传播行为就是多个事务方法相互调用时,事务如何在这些方法间传播。Spring支持7种事务传
5、播行为3-4:事务方法嵌套调用的迷茫 真相:真相: Spring默认的事务传播行为是PROPAGATION_REQUIRED,它适合于绝大多数的情况。假设ServiveX#methodX()都工作在事务环境下(即都被Spring事务增强了),假设程序中存在如下的调用链:Service1#method1()-Service2#method2()-Service3#method3(),那么这3个服务类的3个方法通过Spring的事务传播机制都工作在同一个事务中。4-1:多线程的困惑 问题:问题: 如果在一个ServiceA和a()方法中启动一个线程,在这个新创建的线程中执行ServiceB的事务方
6、法b(),ServiceA的a()方法和ServiceB的b()方法是工作在同一事务环境中,还是分别拥有一个独立的事务呢?4-2:多线程的困惑 真相:真相: 在相同线程中进行相互嵌套调用的事务方法工作于相同的事务中。如果这些相互嵌套调用的方法工作在不同的线程中,不同线程下的事务方法工作在独立的事务中。5-1:联合军种作战的混乱 问题:问题: Hibernate,Spring JDBC,iBatis等多种数据持久方法如何联合使用,会存在哪些问题,如何进行事务管理的配置?5-2:如何配置事务管理器 如果你采用了一个高端ORM技术(Hibernate,JPA,JDO),同时采用一个JDBC技术(Sp
7、ring JDBC,iBatis),由于前者的会话(Session)是对后者连接(Connection)的封装,Spring会“足够智能地”在同一个事务线程让前者的会话封装后者的连接。所以,我们只要直接采用前者的事务管理器就可以了。下表给出了混合数据访问技术所对应的事务管理器: 5-3:丢失更新 由于Hibernate一级缓存的原因,在通过save,update,delete等方法操作数据时,并没有真正向数据库发送SQL,只有调用flush()时,Hibernate才会将一级缓存中的状态变化同步到数据库中。 Hibernate的事务管理在提交事务时,会自动调用flush()操作,将一级缓存同步
8、到数据库中,此时才会将产生并向数据库发送SQL语句。 正是因为以上原因的存在,所有在混合使用JDBC和Hibernate时,可能存在丢失更新的问题。Hibernate:user.setMark(30);session.update(user)JDBC:“update t_user set mark=mark+10”开始事务结束事务Hibernate同步一级缓存 1.“update t_user set mark=30” 2. 提交事务,最终user的mark为30,JDBC的更改被覆盖5-4:缓存不同步 在混合使用Hibernate和JDBC时,JDBC的操作不会同步到Hibernate的缓存
9、中(一级缓存及二级缓存),Hibernate缓存中的状态变更也不被JDBC感知。因此混合使用时必须特别关注这一点。5-5:混合使用最佳实践 由于混合数据访问技术的方案的事务同步而缓存不同步的情况,所以最好用Hibernate完成读写操作,而用Spring JDBC完成读的操作。如用Spring JDBC进行简要列表的查询,而用Hibernate对查询出的数据进行维护。如果确实要同时使用Hibernate和Spring JDBC读写数据,则必须充分考虑到Hibernate缓存机制引发的问题:必须充分分析数据维护逻辑,根据需要,及时调用Hibernate的flush()方法,以免覆盖Spring
10、JDBC的更改,在Spring JDBC更改数据库时,维护Hibernate的缓存。6-1:特殊方法成漏网之鱼 问题:问题: 是否配置了Spring事务AOP增强后,服务方法就可以工作在事务环境中呢?Spring的事务增强有哪些限制条件,哪些方法需要特别关注?6-2:特殊方法成漏网之鱼真相:真相: 由于Spring事务管理是基于接口代理或动态字节码技术,通过AOP实施事务增强的。 对于基于接口动态代理的AOP事务增强来说,由于接口的方法是public的,这就要求实现类的实现方法必须是public的(不能是protected,private等),同时不能使用static的修饰符。所以,可以实施接
11、口动态代理的方法只能是使用“public”或“public final”修饰符的方法,其它方法不可能被动态代理,相应的也就不能实施AOP增强,也即不能进行Spring事务增强了。 基于CGLib字节码动态代理的方案是通过扩展被增强类,动态创建子类的方式进行AOP增强植入的。由于使用final,static,private修饰符的方法都不能被子类覆盖,相应的,这些方法将不能被实施的AOP增强。所以,必须特别注意这些修饰符的使用,以免不小心成为事务管理的漏网之鱼。7-1:数据连接泄漏 问题:问题: 是否使用Spring的事务管理后,就没有数据连接泄漏的问题了?哪些情况下会发生连接泄漏问题,如何处理
12、?7-2:直接从数据源获取连接 如果我们在事务上下文中直接从数据源直接获取连接,且在使用完成后不主动归还给数据源(调用Connection#close()),则将造成数据连接泄漏的问题。7-3:DataSourceUtils Spring提供了一个能从当前事务上下文中获取绑定的数据连接的工具类,那就是DataSourceUtils。Spring强调必须使用DataSourceUtils工具类获取数据连接。lstatic ConnectiondoGetConnection(DataSource dataSource):首先尝试从事务上下文中获取连接,失败后再从数据源获取连接;lstatic Co
13、nnectiongetConnection(DataSource dataSource):和doGetConnection方法的功能一样,实际上,它内部就是调用doGetConnection方法获取连接的;lstatic voiddoReleaseConnection(Connection con, DataSource dataSource):释放连接,放回到连接池中;lstatic voidreleaseConnection(Connection con, DataSource dataSource):和doReleaseConnection方法的功能一样,实际上,它内部就是调用doRel
14、easeConnection方法获取连接的;7-4:DataSourceUtils内部机制getConnectionif(工作在事务上下文,且上下文未绑定连接) 将此连接绑定到事务上下文if(事务上下文连接为空)getConnectiongetConnectionConnectionHolder:= getResource(dataSource)事务上下文管理器getConnection(DataSource dataSource)DataSourceUtilsTransactionSynchronizationManagerDataSource调用者ConnectionHolder事务上下文
15、线程绑定的连接if(工作在事务上下文,且上下文未绑定连接) 将此连接绑定到事务上下文if(事务上下文连接为空)getConnectiongetConnectionConnectionHolder:= getResource(dataSource)getConnection(DataSource dataSource)1.首先尝试从事务上下文获取连接2.如果事务上下文没有连接,则直接从数据源获取3.如果有事务上下文,将连接绑定上当前的事务上下文中。7-5:使用DataSourceUtils获取数据连接也可能造成泄漏 如果DataSourceUtils在没有事务上下文的方法中使用getConnection()获取连接,依然会造成数据连接泄漏! 7-6:JdbcTemplate可以做到对连接泄漏免疫来看一下JdbcTemplate最核心的一个数
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 棉花种植农业气象服务研究考核试卷
- 纺织机械的智能生产流程考核试卷
- 电子产品销售数据分析考核试卷
- 木楼梯生产流程优化考核试卷
- 核子仪表在核材料管制中的技术发展考核试卷
- 管道工程历史文化保护与利用考核试卷
- 电机在电力行业能源科普宣传与教育活动策划的应用考核试卷
- 紧固件行业企业战略联盟与合作考核试卷
- 石油开采业的人力资源管理与培训考核试卷
- 山西大学《工程造价案例分析(实验)》2023-2024学年第二学期期末试卷
- 东北三省三校2025届高三下学期第二次联合模拟考试数学试题及答案
- 污水管道封堵施工方案
- 《中华人民共和国产品质量法》知识培训
- 2025-2030彩色不锈钢项目可行性研究报告
- 2025年山西省华远国际陆港集团有限公司招聘笔试参考题库含答案解析
- 技能人才评价命题技术规程
- 装配式建筑产业发展现状、问题与对策分析
- 中职不等式的试题及答案
- 深信服aES产品技术白皮书-V1.5
- Unit 1 Animal Friends测试卷(含答案解析)-2025新人教版七年级英语下册
- 升学规划家长讲座
评论
0/150
提交评论