`
echohfut
  • 浏览: 233083 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

J2EE事务陷阱

阅读更多

详见: http://www.ibm.com/developerworks/cn/java/j-ts1.html

 

1. 基于 ORM 的框架需要一个事务来触发对象缓存与数据库之间的同步,如Spring框架中

解决方法: @Transactional 注释加在CRUD方法上,同时在Spring配置文件中声明事务管理bean如下:

<tx:annotation-driven transaction-manager="transactionManager"/>

 

 

2. @Transactional 只读标志陷阱

 

@Transactional(readOnly = true, propagation=Propagation.SUPPORTS)
在Spring JDBC(non-ORM)中,由于传播模式被设置为 SUPPORTS,所以不会启动任何事务,因此该方法有效地利用了一个本地(数据库)事务。只读标志只在事务启动时应用。在本例中,因为没有启动任何事务,所以只读标志被忽略。

注:本地事务,一般也称为数据库事务,是数据库做的。本地事务很适合执行单一插入、更新或删除语句的逻辑工作单元(LUW)。我理解的是默认的JDBC自动提交就是这里指的本地事务。

 

@Transactional(readOnly = true, propagation=Propagation.REQUIRED)

在Spring JDBC中,会抛出一个异常,表示您正在试图对一个只读连接执行更新。因为启动了一个事务(REQUIRED),所以连接被设置为只读。毫无疑问,在试图执行 SQL 语句时,您会得到一个异常,告诉您该连接是一个只读连接。

 

在Spring JPA中,上面的事务声明可以正常工作。因为使用基于 ORM 的框架时,只读标志只是对数据库的一个提示,并且一条基于 ORM 框架的指令(本例中是 Hibernate)将对象缓存的 flush 模式设置为 NEVER,表示在这个工作单元中,该对象缓存不应与数据库同步。不过,REQUIRED 传播模式会覆盖所有这些内容,允许事务启动并工作,就好像没有设置只读标志一样。

 

@Transactional 注释的默认传播模式是 REQUIRED。这意味着事务会在不必要的情况下启动。根据使用的数据库,这会引起不必要的共享锁,可能会使数据库中出现死锁的情况。此外,启动和停止事务将消耗不必要的处理时间和资源。总的来说,在使用基于 ORM 的框架时,只读标志基本上毫无用处,在大多数情况下会被忽略。但如果您坚持使用它,请记得将传播模式设置为 SUPPORTS(如清单 9 所示),这样就不会启动事务。

 

文中强调针对读取操作,避免使用 @Transactional 注释,也就是不启动事物。我表示怀疑,就像多线程操作同一个数据一样,需不需要同时对get/set 进行synchronized

 

3. REQUIRES_NEW 事务属性陷阱

 

如果方法1调用方法2, 方法1,2 都声明成Require_new. 那么 方法1中成功调用方法2后,如果代码中出现异常,方法1会回滚,方法2不会。所以Require_new 少用。一般用 MANDATORYREQUIRED 属性。但一种特殊的业务环境下需要这种声明。如:对审计方法使用 REQUIRES_NEW 属性,不管事务的结果如何,审计数据都会被保存

 

4. 事务回滚陷阱

 

 Spring中,运行时异常(即非受控异常)自动强制执行整个逻辑工作单元的回滚,但checked Exception不会

 

亦可声明指定需要回滚的异常:

@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)

在回滚事务这一点上,EJB 的工作方式与 Spring Framework 稍微有点不同。EJB 3.0 规范中的 @TransactionAttribute 注释不包含指定回滚行为的指令。必须使用 SessionContext.setRollbackOnly() 方法将事务标记为执行回滚,

分享到:
评论

相关推荐

    J2EE中文教材

    - **事务管理**:J2EE内置了事务处理功能,支持自动化的事务管理和回滚,确保数据的一致性和完整性。 - **数据交换**:J2EE支持XML格式的数据交换,方便不同系统之间的数据集成与通信。 #### 三、环境部署 - **...

    J2EE core design patterns j2ee 核心设计模式 chm

    8. **Decorator模式**:允许在运行时为对象添加新的行为或责任,尤其在J2EE中,如用于添加事务管理。 9. **Singleton模式**:确保一个类只有一个实例,并提供全局访问点,比如在JNDI(Java Naming and Directory ...

    J2EE经典课件及教材

    【J2EE经典课件及教材】是一套全面且深入的教育资源,专为学习Java企业...同时,教师的个人经验和见解也会帮助你避免常见陷阱,提升开发效率。无论是准备面试、项目开发还是自我提升,这都将是一份不可多得的学习资料。

    J2EE反模式

    在IT行业中,尤其是在Java企业级应用开发领域,J2EE(Java 2 Platform, Enterprise ...阅读这份文档,开发者可以更好地理解这些潜在陷阱,并在实际工作中做出更明智的设计决策,从而提高J2EE应用的性能和可维护性。

    J2EE 经典实例详解(1-100)

    每一个实例都应该是精心设计的,不仅解决特定问题,还强调最佳实践和常见陷阱,帮助读者理解J2EE的精髓,提升开发技能。通过阅读和实践这些实例,开发者可以更深入地理解J2EE技术,并将其成功应用于实际项目中。

    j2ee高级软件架构师培训资料内部资料-架构物理设计

    3. **分布式系统设计**:J2EE架构常常涉及分布式系统,资料会讨论负载均衡、集群、分布式缓存(如JNDI和JCache)以及事务管理在分布式环境中的实现。 4. **数据库设计**:物理数据库设计是架构设计的重要部分,资料...

    NIIT J2EE考试试题

    **J2EE技术详解** Java 2 Platform, Enterprise Edition (J2EE) ...- 分析历年试题,理解常见考点和陷阱 通过系统学习和充分准备,考生可以在"NIIT J2EE考试试题"中取得好成绩,进一步提升自己在J2EE领域的专业技能。

    J2EE架构师手册

    《J2EE架构师手册》是一本专门为那些在企业级Java平台上进行系统设计与开发的架构师准备的参考资料。...同时,手册可能还包含实践案例和最佳实践,帮助你在实际工作中避免常见陷阱,提升架构设计的水平。

    code: J2EE Core Patterns

    8. **事务管理**:J2EE提供了一套完整的事务管理机制,包括本地事务和全局事务,确保业务操作的原子性和一致性。 9. **资源注入(Dependency Injection)**:Java EE的注解如`@EJB`, `@Resource`等,实现了依赖注入...

    Expert_One-on-One_J2EE_Development_without_EJB中文版 part10

    10. **最佳实践**:总结了开发J2EE应用时的一些建议和技巧,以避免常见陷阱,提高开发效率。 《Expert One-on-One J2EE Development without EJB中文版 part10》的阅读可以帮助开发者跳出EJB的传统框架,用更灵活的...

    J2EE英语面试资料

    **J2EE(Java 2 Platform, Enterprise Edition)是...通过阅读这份指南,读者可以期待涵盖这些主题的详细讨论,包括面试常见问题、最佳实践以及可能的陷阱和挑战。对于提升技能和成功通过面试,这将是一份宝贵的资源。

    SUN - Core J2EE patterns

    《SUN - Core J2EE patterns》一书深入探讨了Java 2 Platform, Enterprise Edition (J2EE)架构中的设计模式与最佳实践,为开发者提供了一套系统化的解决方案,旨在帮助他们在复杂的企业级应用开发中避免常见的陷阱和...

    J2EE Antipatterns

    - **不合理的事务边界**:事务管理是J2EE中的一个重要组成部分,不合理的事务边界设置会导致性能问题或数据一致性问题。 - **缺乏层次分离**:在多层架构中,如果各层之间的职责不明确,则会导致耦合度过高,影响...

    J2EE核心模式.7z

    这本书的核心目标是提供一套经过实战检验的设计模式,帮助开发者避免常见的设计陷阱,提升应用程序的质量和性能。 J2EE作为Java平台的企业版本,主要用于开发和部署多层分布式应用,它包括了一系列的组件和服务,如...

    Expert One-on-One J2EE Design and Development

    - 分析常见的开发陷阱和解决方案,帮助读者避免常见的错误。 - **第5章:示例应用的需求分析** - 详细介绍示例应用的功能需求和技术需求,为后续章节提供背景信息。 - 分析需求分析阶段的关键步骤,包括用户访谈...

    J2EE 核心模式

    这本书主要关注于设计模式,这些模式是经过实际项目验证的解决方案,可以帮助开发者避免常见的设计陷阱,提高代码的可维护性和可复用性。 在J2EE的核心模式中,有几个关键概念和技术值得深入理解: 1. **分层架构*...

    JAVA设计模式之事务处理.pdf

    Java技术体系中的J2EE(Java 2 Enterprise Edition)提供了强大的事务管理机制——JTA(Java Transaction API),支持跨资源的事务管理。然而,在许多实际应用场景中,应用往往只需要处理单一的数据源(通常是数据库...

    《轻量级J2EE企业应用实践-tructs+sping+hibernate整合开发》--05

    6. **最佳实践**:“05”章节可能会讨论在实际开发中如何优化这三者的整合,比如事务管理策略、性能调优和错误处理等,帮助开发者遵循最佳实践,避免常见陷阱。 7. **测试与调试**:在集成开发中,测试和调试是非常...

    Professional Servlets and JSP The J2EE Web Tier

    本书《Professional Servlets and JSP The J2EE Web Tier》是Jayson Falkner和Kevin Jones所著,是关于如何使用JavaServer Pages 2.0和Servlets 2.4构建动态Java Web应用的详尽指南。它提供了使用Servlet和JSP技术...

    j2eeapi开发文档

    2. **EJB(Enterprise JavaBeans)**: EJB是J2EE中的核心组件,用于构建可复用的、事务安全的后端业务逻辑。EJB有三种类型:Session Beans(会话bean)用于表示业务逻辑,Message-driven Beans(消息驱动bean)用于...

Global site tag (gtag.js) - Google Analytics