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

    springmvc事务配置在service

    中间层创建事务失败解决

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

    spring框架事务控制

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

    jdbc三层中使用事务

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

    工厂模式三层架构增删改查分页(BLL层使用事务)源码

    本软件是一个工厂模式三层架构例子程序(★特点与难点是在BLL层使用数据库事务,而不在DAL层使用数据库事务)。程序通过WinForm应用程序实现Sql Server 2005,Sqlite 3的增、删、改、查,分页功能。是学习三层架构、...

    jdbc在DAO层实现事务

    自己写的一个java示例 该示例用jdbc与java事务来实现DAO层的各个DAO的各方法之间的事务关联 使上层可以保证各数据访问的原子性 该示例包含了一个方便调用的数据库访问工具类,该工具类实现了调用SQL语句,调用...

    mybatis中的事务的开启

    mybatis中的事务的开启,有利于读者自己配置mybatis参数,实现自己的要求。

    使用ThreadLocal解决代码分层问题

    javaee开发常见的模式有MVC模式,在C层中常常会再次分层,如:servlet(web层)、service(业务逻辑层)、dao(数据访问层),其中service和dao最容易混在一起,如转钱交易场景,service层需要执行“事务”操作,会...

    事务处理API分布式事务处理

    本文的目的是要提供一个关于的Java事务处理... 一个分布式事务处理只是一个在两个或更多网络资源上访问和更新数据的事务处理,因此它在那些资源之间必然是等价的。在本文中,我们主要关心的是如何处理关系数据库系统。

    SpringBoot的事务使用和回滚功能讲解.docx

    Springboot中事务的使用: 1、启动类加上@EnableTransactionManagement注解,开启事务...如果controller未开启事务,service中开始了事务,service成功执行,controller在之后的运行中出现异常(错误),不会自动回滚。

    Spring自定义切面事务问题

    需要使用Spring切面,同时需要保证事务正常。可使用文档中的方法。一般情况,若不做特殊处理。使用切面,事务将会失效。

    Spring事务传播特性解析

    方法被调用时自动开启事务,在事务范围内使用则使用同一个事务,否则开启新事务。 2、Propagation.REQUIRES_NEW 无论何时自身都会开启事务 3、Propagation.SUPPORTS 自身不会开启事务,在事务范围内则...

    基于springboot整理的分布式事务及动态数据源切换

    整理的分布式事务 及动态数据源切换 基于数据库XA协议 maven 包可直接使用 maven 引入路径: ... <artifactId>... @DynamicDBSource("run") 可标注在server层也可以标注在Dao层 即可指定方法内使用的数据源

    ssm部门员工增上改查加事务管理

    这个ssm的增上改查是基于部门员工表的,并且增加了spring的事务管理,事务管理我放在增加员工上面了,在service层手动制造了一个1/0的by zero的bug 大家下载的时候注意一下,spring的事务在ssm中还是蛮重要的,建议...

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

    Spring通过AOP实现声明式事务管理。通常通过TransactionProxyFactoryBean设置Spring事务代理。

    Synchronized锁在Spring事务管理下线程不安全

    Synchronized锁在Spring事务管理下,导致线程不安全。

    会计师事务所审计管理层声明书.pdf

    会计师事务所审计管理层声明书.pdf

    在多层结构中利用事务处理保证数据的一致性

    摘要:先分析了数据库管理系统中的事务处理,接着分析了多层结构及其在...一致,既分别在客户端如何利用显式事务处理、在中间层如何利用隐式事务处理、在远程数据库服 务器层如何利用触发器事务处理来实现数据一致。

    Spring事务优缺点及使用详解.docx

    事务简介 二、程序举例环境搭建 o1. 创建数据表 o2....o3....o4....o5....o6....o7. 定义service接口及实现类 o8....o9....o10....三、使用 Spring 的事务注解管理事务 o1.... 业务层 public 方法加入事务属性 o5. 测试

Global site tag (gtag.js) - Google Analytics