0 0

事务开启在service层的疑问5

开发使用的是ssh,action调用service,service调用dao。使用spring的事务管理将事务开启在service层,但是现在有个疑问。如果我的action调用了多个service那个如果其中一个service出现异常这个service会回滚但是对于整个action来说其实还是不对的。那么事务就要开启在action层了。那么如果我的action经常要调用多个service还有必要要把事务开启在service层吗?下面是伪代码
class testAction{
    testAService.add();
    testBService.update();   //出现异常,那么add已经调用过了是不会回滚事务的!!!
    testCService.del()
}


虽然我可以在action层开启事务,这样这3个service就会在同一个事务中了。

问题补充:
jobar 写道
不需要在action开启事务,你想要保证add,update,del的原子性,就要在service层把他们放在一个事务里面执行。

也就是说我要在testAService的add()方法中调用testBService的update方法和testCService的del方法是吗??

问题补充:
xiaofengxp 写道
    Action当然不应该放置业务逻辑和事务控制,在很多的框架中,Controller依赖Servlet API,这样非HTTP请求不就能复用业务逻辑和事务控制。
    要考虑你的Service的粒度设计,可能许多人会将service中的内容当做dao来写,而将Action当做了Service。
    在Action中调用了多个service的业务逻辑方法相当于在Action中编写业务逻辑代码,从分层的角度讲,Action应该做的只是数据的获取,执行某个动作,视图的转发,而动作的具体分解交由service完成。所以还是应该将Action中的调用三个service类业务逻辑类的方式封装到一个service中完成。
    除非你的业务足够的复杂,非要这么做才能实现,否则不应该将事务控制在Action。
   

也就是业务逻辑放在service层来处理是吗

问题补充:
引用
也就是说我要在testAService的add()方法中调用testBService的update方法和testCService的del方法是吗??[/quote
不必要在add中调用另外两个方法才能达到效果,可以这样

@Transactional
class testAction{
try{
    testAService.add();
}catch(Exception e){
...
}
try{
    testBService.update();
}catch(Exception e){
...
}
    try{
testCService.del();
}catch(Exception e){
...
}
}



这样写是将事务开启在action吗??

问题补充:
jobar 写道
引用
这样写是将事务开启在action吗??

当然不是开启在action,testAction只是一个方法的名称

事务不该开启在action层,@xiaofengxp说的有道理。涉及到一些业务逻辑的要放在service层,也就是这个方法应该放在某个service里面

class testAction {
    @Transactional  
    public String add(){
        try{
            testAService.add();
        }catch(Exception  e){
           .....
        }
        try{
            testBService.update();
        }catch(Exception  e){
           .....
        }
        try{
            testCService.del();
        }catch(Exception  e){
           .....
        }
    }
}

这样的写法不是在Action层的add方法上面添加事务吗??
2012年5月04日 15:41

6个答案 按时间排序 按投票排序

0 0

采纳的答案

不好意思,直接copy你的代码了,在service层这么写

    @Transactional  
    class someOperation{  
    try{  
        add();  
    }catch(Exception e){  
    ...  
    }  
    try{  
        update();  
    }catch(Exception e){  
    ...  
    }  
        try{  
    del();  
    }catch(Exception e){  
    ...  
    }  
    }  

2012年5月08日 10:27
0 0

我认为事务是肯定要在service层控制的,如果使用的是spring配置事务,那么需要抛出异常(默认是运行时异常)才能触发回滚。而action通常要捕获异常并作处理的,比如出现异常要跳转到特定的地方去。
但是我的回答附加一个疑问,希望大家帮忙解惑。就是当有很多业务校验并最终有业务操作的时候,这些校验和业务操作是否都放在(或嵌套进)一个service中以保证他们存在一个事务中呢?
我遇到的问题是,在action中顺序排放很多service方法用于各种校验,顺序通过后将会进入业务操作的service,但是我怀疑出现并发的时候,在校验之后且业务操作之前,可能有其他部分对数据有操作。然后当前的业务操作将对脏数据进行处理。
我不知道我说的对不对?该怎么设计action中的service方法?

2012年6月04日 21:00
0 0

引用
这样写是将事务开启在action吗??

当然不是开启在action,testAction只是一个方法的名称

事务不该开启在action层,@xiaofengxp说的有道理。涉及到一些业务逻辑的要放在service层,也就是这个方法应该放在某个service里面

2012年5月07日 18:09
0 0

也就是说我要在testAService的add()方法中调用testBService的update方法和testCService的del方法是吗??[/quote
不必要在add中调用另外两个方法才能达到效果,可以这样

@Transactional
class testAction{
try{
    testAService.add();
}catch(Exception e){
...
}
try{
    testBService.update();
}catch(Exception e){
...
}
    try{
testCService.del();
}catch(Exception e){
...
}
}


2012年5月07日 17:46
0 0

    Action当然不应该放置业务逻辑和事务控制,在很多的框架中,Controller依赖Servlet API,这样非HTTP请求不就能复用业务逻辑和事务控制。
    要考虑你的Service的粒度设计,可能许多人会将service中的内容当做dao来写,而将Action当做了Service。
    在Action中调用了多个service的业务逻辑方法相当于在Action中编写业务逻辑代码,从分层的角度讲,Action应该做的只是数据的获取,执行某个动作,视图的转发,而动作的具体分解交由service完成。所以还是应该将Action中的调用三个service类业务逻辑类的方式封装到一个service中完成。
    除非你的业务足够的复杂,非要这么做才能实现,否则不应该将事务控制在Action。
   

2012年5月04日 18:27
0 0

不需要在action开启事务,你想要保证add,update,del的原子性,就要在service层把他们放在一个事务里面执行。

2012年5月04日 16:58

相关推荐

    springmvc事务配置在service.zip

    要在Service层使用注解来控制事务,你需要开启基于注解的事务管理,并配置相关的事务属性。在Spring配置文件中添加以下内容: ```xml ``` 这行代码告诉Spring扫描带有@Transactional注解的类和方法,并自动...

    action层,dao层 ,service层,entity层1

    此外,Service层还可以处理事务管理,确保数据的一致性。这一层与Action层交互,提供业务服务,与DAO层交互,完成数据操作。 4. **Entity层(领域模型层/实体层)**: Entity层定义了应用中的对象模型,这些对象...

    Spring的作用贯穿了整个中间层,将Web层、Service层、DAO层及PO无缝整合

    - **Spring**:用于Service层和DAO层,提供依赖管理和事务管理等功能。 - **Hibernate**:用于DAO层,负责对象关系映射(ORM),使得Java对象能够与数据库表相对应。 3. **配置文件**:配置文件是Spring框架中的...

    jsp、servlet进行增删改查,dao层和service层分开

    在Java Web开发中,"jsp、servlet进行增删改查,dao层和service层分开"是一种常见的设计模式,它遵循了MVC(Model-View-Controller)架构,旨在提高代码的可维护性和可扩展性。以下是这个模式的详细解释: 1. **...

    若依框架分布式事务配置和项目启动手册

    - 开启事务注解:在需要事务控制的Service或Controller层方法上添加@Transactional注解。 4. **项目启动流程** - 环境部署:首先,确保所有依赖服务(如数据库、消息队列、配置中心等)正常运行。 - 应用启动:...

    Java SSM service层配置文件

    4. **AOP配置**:在Service层,我们可能会用到事务管理。Spring AOP可以很方便地实现方法级的事务控制。例如,添加以下配置启用声明式事务管理: ```xml ``` 这样,Service方法上的@Transactional注解就...

    Spring配置事务在DAO层和业务逻辑层

    ### Spring配置事务在DAO层和业务逻辑层 #### 一、Spring事务管理概述 Spring框架提供了两种事务管理方式:编程式事务管理和声明式事务管理。其中,声明式事务管理是通过配置来完成的,它利用Spring AOP特性,将...

    java代码生成器(dao层service层)

    Service层则是业务逻辑处理的中心,它调用DAO层的方法来实现对数据的操作,并且可能涉及到事务管理、异常处理、缓存等高级功能。服务层代码生成通常包括服务接口和服务实现类,服务接口定义了对外提供的业务方法,...

    Spring 注解学习手札(五) 业务层事务处理

    当你在业务层的方法上添加`@Transactional`,Spring会自动为该方法开启一个事务,并在方法执行完毕后根据返回结果决定提交还是回滚事务。例如: ```java @Service public class UserService { @Transactional ...

    中间层创建事务失败解决

    中间层创建事务失败解决,原因:MSDTC服务不能启动

    使用代理实现Hibernate Dao层自动事务

    5. 在业务层调用Dao的代理对象:在Service层或Controller层,注入Dao的代理对象,通过代理对象调用Dao的方法,Spring会自动处理事务的生命周期。 通过这样的方式,我们能够实现Hibernate Dao层的自动事务管理,让...

    spring+ibatis声明式事务Demo

    5. 开启声明式事务:在Service层的方法上使用`@Transactional`注解,表明该方法需要在事务中执行。 6. 实际业务逻辑:在Service层的方法内部,通过SqlSessionTemplate执行SQL语句,进行数据操作。 7. 提交或回滚事务...

    spring框架事务控制

    防止在一些意外(例如说突然断电)的情况下出现乱数据,防止数据库数据出现问题。 如:银行转帐。A账户减少的钱要加到B账户上,若A这边减了钱,B那边却还是一样的数,这就出大问题: 如:要添加多条数据,程序要求必须...

    spring配置在DAO和事务层(DOC)

    ### Spring配置在DAO和事务层知识点详解 #### 一、Spring框架中的事务管理机制 Spring 框架提供了强大的事务管理功能,支持多种事务管理方式,包括编程式事务管理和声明式事务管理。其中,声明式事务管理是通过...

    jdbc三层中使用事务

    本案例使用纯JDBC+三层架构,演示在业务逻辑层中使用事务的方式. 导言:如何脱离框架,在使用了dao模式的项目中在业务逻辑层中使用jdbc事务?又如何保证每个dao方法的Connection对象统一且不被关闭?如何确保在多线程环境...

    DWR+JPA DWR直接访问SERVICE层,并直接处理DAO返回的BEAN.doc

    在使用JPA的SERVICE层,配置事务是非常重要的。DWR调用结束时,由于默认情况下EntityManager会在方法执行完毕后关闭,这可能导致延迟初始化(lazy-init)属性失效,因为在浏览器端试图访问这些属性时,数据库连接...

    spring声明事务,编程事务实现

    在手动控制事务时,需要在 Service 层中关心 Connection 或 Session 等对象,但这并不是 Service 层应该关心的。使用 Spring 可以将事务管理与业务逻辑分离,使得业务代码不受污染。 Spring 的事务管理器提供了...

    用Hibernate和Spring开发事务持久层.rar_spring

    `<tx:annotation-driven>`元素启用基于注解的事务管理,使得在Service层的类方法上可以使用`@Transactional`注解来声明事务边界。 接下来,我们关注`用Hibernate和Spring开发事务持久层`这个主题。在实际项目中,...

    Java事务设计模式_java_事务设计模式_

    例如,使用Spring的PlatformTransactionManager接口,通过TransactionTemplate或直接在Service层使用@Transactional注解进行事务管理。 3. **声明式事务模型**:这是更推荐的方式,事务管理与业务逻辑分离,使得...

    在SSH框架中加入事务支持

    当Spring管理事务时,Hibernate的Session将在事务范围内打开和关闭,保证了数据的一致性。 至于Struts,它是SSH框架的前端控制器,主要负责请求的转发和视图的渲染。在加入事务支持的过程中,Struts并不直接参与...

Global site tag (gtag.js) - Google Analytics