详见: 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 少用。一般用 MANDATORY
或 REQUIRED
属性。但一种特殊的业务环境下需要这种声明。如:对审计方法使用 REQUIRES_NEW
属性,不管事务的结果如何,审计数据都会被保存
4. 事务回滚陷阱
Spring中,运行时异常(即非受控异常)自动强制执行整个逻辑工作单元的回滚,但checked Exception不会
亦可声明指定需要回滚的异常:
@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
在回滚事务这一点上,EJB 的工作方式与 Spring Framework 稍微有点不同。EJB 3.0 规范中的 @TransactionAttribute
注释不包含指定回滚行为的指令。必须使用 SessionContext.setRollbackOnly()
方法将事务标记为执行回滚,
分享到:
相关推荐
- **事务管理**:J2EE内置了事务处理功能,支持自动化的事务管理和回滚,确保数据的一致性和完整性。 - **数据交换**:J2EE支持XML格式的数据交换,方便不同系统之间的数据集成与通信。 #### 三、环境部署 - **...
8. **Decorator模式**:允许在运行时为对象添加新的行为或责任,尤其在J2EE中,如用于添加事务管理。 9. **Singleton模式**:确保一个类只有一个实例,并提供全局访问点,比如在JNDI(Java Naming and Directory ...
【J2EE经典课件及教材】是一套全面且深入的教育资源,专为学习Java企业...同时,教师的个人经验和见解也会帮助你避免常见陷阱,提升开发效率。无论是准备面试、项目开发还是自我提升,这都将是一份不可多得的学习资料。
在IT行业中,尤其是在Java企业级应用开发领域,J2EE(Java 2 Platform, Enterprise ...阅读这份文档,开发者可以更好地理解这些潜在陷阱,并在实际工作中做出更明智的设计决策,从而提高J2EE应用的性能和可维护性。
每一个实例都应该是精心设计的,不仅解决特定问题,还强调最佳实践和常见陷阱,帮助读者理解J2EE的精髓,提升开发技能。通过阅读和实践这些实例,开发者可以更深入地理解J2EE技术,并将其成功应用于实际项目中。
3. **分布式系统设计**:J2EE架构常常涉及分布式系统,资料会讨论负载均衡、集群、分布式缓存(如JNDI和JCache)以及事务管理在分布式环境中的实现。 4. **数据库设计**:物理数据库设计是架构设计的重要部分,资料...
**J2EE技术详解** Java 2 Platform, Enterprise Edition (J2EE) ...- 分析历年试题,理解常见考点和陷阱 通过系统学习和充分准备,考生可以在"NIIT J2EE考试试题"中取得好成绩,进一步提升自己在J2EE领域的专业技能。
《J2EE架构师手册》是一本专门为那些在企业级Java平台上进行系统设计与开发的架构师准备的参考资料。...同时,手册可能还包含实践案例和最佳实践,帮助你在实际工作中避免常见陷阱,提升架构设计的水平。
8. **事务管理**:J2EE提供了一套完整的事务管理机制,包括本地事务和全局事务,确保业务操作的原子性和一致性。 9. **资源注入(Dependency Injection)**:Java EE的注解如`@EJB`, `@Resource`等,实现了依赖注入...
10. **最佳实践**:总结了开发J2EE应用时的一些建议和技巧,以避免常见陷阱,提高开发效率。 《Expert One-on-One J2EE Development without EJB中文版 part10》的阅读可以帮助开发者跳出EJB的传统框架,用更灵活的...
**J2EE(Java 2 Platform, Enterprise Edition)是...通过阅读这份指南,读者可以期待涵盖这些主题的详细讨论,包括面试常见问题、最佳实践以及可能的陷阱和挑战。对于提升技能和成功通过面试,这将是一份宝贵的资源。
《SUN - Core J2EE patterns》一书深入探讨了Java 2 Platform, Enterprise Edition (J2EE)架构中的设计模式与最佳实践,为开发者提供了一套系统化的解决方案,旨在帮助他们在复杂的企业级应用开发中避免常见的陷阱和...
- **不合理的事务边界**:事务管理是J2EE中的一个重要组成部分,不合理的事务边界设置会导致性能问题或数据一致性问题。 - **缺乏层次分离**:在多层架构中,如果各层之间的职责不明确,则会导致耦合度过高,影响...
这本书的核心目标是提供一套经过实战检验的设计模式,帮助开发者避免常见的设计陷阱,提升应用程序的质量和性能。 J2EE作为Java平台的企业版本,主要用于开发和部署多层分布式应用,它包括了一系列的组件和服务,如...
- 分析常见的开发陷阱和解决方案,帮助读者避免常见的错误。 - **第5章:示例应用的需求分析** - 详细介绍示例应用的功能需求和技术需求,为后续章节提供背景信息。 - 分析需求分析阶段的关键步骤,包括用户访谈...
这本书主要关注于设计模式,这些模式是经过实际项目验证的解决方案,可以帮助开发者避免常见的设计陷阱,提高代码的可维护性和可复用性。 在J2EE的核心模式中,有几个关键概念和技术值得深入理解: 1. **分层架构*...
Java技术体系中的J2EE(Java 2 Enterprise Edition)提供了强大的事务管理机制——JTA(Java Transaction API),支持跨资源的事务管理。然而,在许多实际应用场景中,应用往往只需要处理单一的数据源(通常是数据库...
6. **最佳实践**:“05”章节可能会讨论在实际开发中如何优化这三者的整合,比如事务管理策略、性能调优和错误处理等,帮助开发者遵循最佳实践,避免常见陷阱。 7. **测试与调试**:在集成开发中,测试和调试是非常...
本书《Professional Servlets and JSP The J2EE Web Tier》是Jayson Falkner和Kevin Jones所著,是关于如何使用JavaServer Pages 2.0和Servlets 2.4构建动态Java Web应用的详尽指南。它提供了使用Servlet和JSP技术...
2. **EJB(Enterprise JavaBeans)**: EJB是J2EE中的核心组件,用于构建可复用的、事务安全的后端业务逻辑。EJB有三种类型:Session Beans(会话bean)用于表示业务逻辑,Message-driven Beans(消息驱动bean)用于...