`

Spring事务管理最容易犯的一种错误

    博客分类:
  • java
阅读更多

此错误来自于实际项目中,所使用的解决方法在实际应用中证明是正确的。

 

项目背景:采用SSH架构,tomcat部署,apache负责集群,terracotta负责session共享。

 

在我们维护某项目的初期,当访问我们的web服务的用户数过多时,会出现apache的JK Status Manager中Busy数过高,当达到某一峰值,我这里遇到的Busy数是300左右时,对应tomcat将宕掉。

 

下面是我们在action个中使用事务的代码模板,我想通常大家也是这样用的吧。

 

DefaultTransactionDefinition def = new DefaultTransactionDefinition();
TransactionStatus status = transactionManager.getTransaction(def);
try {
    ...

    transactionManager.commit(status);
    return SUCCESS;

} catch (Exception e) {
    ...
    transactionManager.rollback(status);
    return ERROR;
}

 

其实这里隐藏着一个很大的问题,即当try中有程序员使用“return ERROR;”语句跳出此程序段时,数据库已经接收到此事务,并将对应表锁住,等待提交或是回滚命令,但此时已无法执行到之后的“transactionManager.commit(status);”或是“transactionManager.rollback(status);”,当多用户应用本系统时,就很容易出现oracle锁等待的问题。

 

此处的解决办法是,在try{}代码段中,出现任何的return,都应根据return的性质,决定在此处是加入“transactionManager.commit(status);”还是加入“transactionManager.rollback(status);”,以确保不出现oracle锁等待的问题。

 

有时,我也发现有些程序员在try{}代码段中“transactionManager.commit(status);"之后,又对数据库进行了某些操作,才”return SUCCESS;“。我不建议这样做,程序员应该清楚此时的数据库操作自己是否要作为事务的一部分,这个问题是必须明确的。如果要作为事务的一部分,就应该放在“transactionManager.commit(status);"之前,如果不是作为事务的一部分,就应该放在整个事务处理之后,也就是上面catch{}完结之后。不然极易让人误读,不利于后期维护,关键也很容易让代码出错。

 

0
2
分享到:
评论

相关推荐

    Spring事务管理失效原因汇总

    标题“Spring事务管理失效原因汇总”指出了本文的核心内容是分析在使用Spring框架进行事务管理时可能遇到的问题及其原因。描述部分进一步说明了事务失效的后果往往不明显,容易在测试环节被忽略,但在生产环境中出现...

    spring事务案例分析.zip

    1. **Spring声明式事务管理**:这是Spring中最常用的一种事务管理方式,通过在方法上添加@Transactional注解,Spring容器会在方法执行前后自动进行事务的开启、提交、回滚等操作。例如,在业务服务类的方法上标注此...

    spring 注解事务管理

    在Spring框架中,注解事务管理是一种非常便捷的方式,它允许开发者通过在方法上添加特定的注解来声明式地管理事务。这种方式极大地简化了事务的配置,使得代码更加清晰和易于维护。以下是对"spring注解事务管理"这一...

    spring事务管理.doc

    总的来说,Spring事务管理提供了一种灵活、强大的方式来处理应用程序中的事务,无论是在简单还是复杂的事务场景下,都能有效保证数据的一致性和完整性。通过声明式事务管理,开发者可以将关注点从事务细节中解脱出来...

    Spring 事务简单完整例子

    对于JDBC事务,Spring提供了一种统一的事务管理接口`PlatformTransactionManager`,它抽象了底层数据源的事务管理细节。常见的实现有`DataSourceTransactionManager`,它适用于传统的JDBC操作。当在Spring中配置了`...

    SPRING事务机制DEMO

    Spring事务管理提供了一种声明式的方式来控制事务边界,使得开发者无需显式地调用开始、提交或回滚事务。 在Spring中,有以下两种事务管理方式: 1. **编程式事务管理**:开发者需要手动调用`...

    spring事务管理1

    **一致性(Consistency)**:事务完成后,系统必须处于一种满足业务规则的一致状态。例如,如果一个转账操作要求账户A的资金减少,账户B的资金增加,那么在事务结束后,账户A和B的总金额应保持不变,且符合转账的...

    Spring事务类型祥解

    此外,Spring还提供了一种基于注解的回滚规则,即`@Rollback`注解,可以在测试中使用。 5. **Spring Boot中的事务管理**: 在Spring Boot项目中,通常使用`@EnableTransactionManagement`注解开启事务管理,并通过...

    spring事务管理.docx

    声明式事务管理更适用于大部分场景,因为它提供了一种简洁、灵活且易于管理的事务控制方式。 3. **ACID 事务属性**: - **原子性(Atomicity)**:事务中的所有操作被视为单个操作,要么全部完成,要么全部不完成...

    实例详解Spring JDBC事务管理.doc

    Spring事务管理机制 Spring的事务管理机制是基于PlatformTransactionManager接口的实现的,该接口定义了三个方法:getTransaction、commit和rollback。这三个方法是事务管理的核心,分别负责事务的开启、提交和...

    aop与spring事务处理

    ### AOP与Spring事务处理详解 ...AOP 能够有效地将横切关注点从业务逻辑中分离出来,而Spring事务管理则为开发者提供了简单、灵活的方式来管理事务。这两种技术相结合,能够显著提高软件的质量和开发效率。

    JavaEE spring事务操作环境和基本功能搭建

    本文将详细讲解如何搭建Spring事务操作环境以及实现基本功能。 首先,理解事务(Transaction)的重要性。在数据库操作中,事务是确保数据一致性和完整性的关键概念。一个事务是一系列数据库操作的集合,这些操作...

    spring 的事务管理手册

    Spring提供了两种事务管理方式:代码级事务管理和声明式事务管理。代码级事务管理允许程序员在代码中精确控制事务的开始、提交和回滚,适合需要精细控制的情况。声明式事务管理则通过配置文件或注解来定义事务规则,...

    Spring事务的传播特性和隔离级别

    ### Spring事务的传播特性和隔离级别 #### 一、事务的基本概念 在计算机科学中,事务(transaction)是指一系列操作的集合,这些操作要么全部成功完成,要么全部失败回滚,确保数据的一致性和完整性。事务具备四个...

    Spring事务配置的五种方式

    在第一种配置方式中,每个 Bean 都有一个代理,这是基于 AOP(面向切面编程)的事务管理。Spring 使用代理来拦截方法调用,以便在方法执行前后添加事务管理逻辑。下面是一个简单的配置示例: ```xml ...

    Spring4--3.jdbcTemplate事务

    - **事务模板**:TransactionTemplate是编程式事务管理的一个工具类,它提供了一种简单的方式来包装数据库操作。类似于JdbcTemplate,TransactionTemplate也处理了事务的开始、提交和回滚。 - **异常回滚规则**:...

    spring事务全解释

    Spring为事务管理提供了一种更高级的抽象,即`PlatformTransactionManager`接口。这个接口定义了开始、提交和回滚事务的方法,使得事务管理可以独立于具体的数据库技术。例如,`DataSourceTransactionManager`适用于...

Global site tag (gtag.js) - Google Analytics