-
事务开启在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个答案 按时间排序 按投票排序
-
采纳的答案
不好意思,直接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
-
我认为事务是肯定要在service层控制的,如果使用的是spring配置事务,那么需要抛出异常(默认是运行时异常)才能触发回滚。而action通常要捕获异常并作处理的,比如出现异常要跳转到特定的地方去。
但是我的回答附加一个疑问,希望大家帮忙解惑。就是当有很多业务校验并最终有业务操作的时候,这些校验和业务操作是否都放在(或嵌套进)一个service中以保证他们存在一个事务中呢?
我遇到的问题是,在action中顺序排放很多service方法用于各种校验,顺序通过后将会进入业务操作的service,但是我怀疑出现并发的时候,在校验之后且业务操作之前,可能有其他部分对数据有操作。然后当前的业务操作将对脏数据进行处理。
我不知道我说的对不对?该怎么设计action中的service方法?2012年6月04日 21:00
-
引用这样写是将事务开启在action吗??
当然不是开启在action,testAction只是一个方法的名称
事务不该开启在action层,@xiaofengxp说的有道理。涉及到一些业务逻辑的要放在service层,也就是这个方法应该放在某个service里面2012年5月07日 18:09
-
也就是说我要在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
-
Action当然不应该放置业务逻辑和事务控制,在很多的框架中,Controller依赖Servlet API,这样非HTTP请求不就能复用业务逻辑和事务控制。
要考虑你的Service的粒度设计,可能许多人会将service中的内容当做dao来写,而将Action当做了Service。
在Action中调用了多个service的业务逻辑方法相当于在Action中编写业务逻辑代码,从分层的角度讲,Action应该做的只是数据的获取,执行某个动作,视图的转发,而动作的具体分解交由service完成。所以还是应该将Action中的调用三个service类业务逻辑类的方式封装到一个service中完成。
除非你的业务足够的复杂,非要这么做才能实现,否则不应该将事务控制在Action。
2012年5月04日 18:27
相关推荐
要在Service层使用注解来控制事务,你需要开启基于注解的事务管理,并配置相关的事务属性。在Spring配置文件中添加以下内容: ```xml ``` 这行代码告诉Spring扫描带有@Transactional注解的类和方法,并自动...
此外,Service层还可以处理事务管理,确保数据的一致性。这一层与Action层交互,提供业务服务,与DAO层交互,完成数据操作。 4. **Entity层(领域模型层/实体层)**: Entity层定义了应用中的对象模型,这些对象...
- **Spring**:用于Service层和DAO层,提供依赖管理和事务管理等功能。 - **Hibernate**:用于DAO层,负责对象关系映射(ORM),使得Java对象能够与数据库表相对应。 3. **配置文件**:配置文件是Spring框架中的...
在Java Web开发中,"jsp、servlet进行增删改查,dao层和service层分开"是一种常见的设计模式,它遵循了MVC(Model-View-Controller)架构,旨在提高代码的可维护性和可扩展性。以下是这个模式的详细解释: 1. **...
- 开启事务注解:在需要事务控制的Service或Controller层方法上添加@Transactional注解。 4. **项目启动流程** - 环境部署:首先,确保所有依赖服务(如数据库、消息队列、配置中心等)正常运行。 - 应用启动:...
4. **AOP配置**:在Service层,我们可能会用到事务管理。Spring AOP可以很方便地实现方法级的事务控制。例如,添加以下配置启用声明式事务管理: ```xml ``` 这样,Service方法上的@Transactional注解就...
### Spring配置事务在DAO层和业务逻辑层 #### 一、Spring事务管理概述 Spring框架提供了两种事务管理方式:编程式事务管理和声明式事务管理。其中,声明式事务管理是通过配置来完成的,它利用Spring AOP特性,将...
Service层则是业务逻辑处理的中心,它调用DAO层的方法来实现对数据的操作,并且可能涉及到事务管理、异常处理、缓存等高级功能。服务层代码生成通常包括服务接口和服务实现类,服务接口定义了对外提供的业务方法,...
当你在业务层的方法上添加`@Transactional`,Spring会自动为该方法开启一个事务,并在方法执行完毕后根据返回结果决定提交还是回滚事务。例如: ```java @Service public class UserService { @Transactional ...
中间层创建事务失败解决,原因:MSDTC服务不能启动
5. 在业务层调用Dao的代理对象:在Service层或Controller层,注入Dao的代理对象,通过代理对象调用Dao的方法,Spring会自动处理事务的生命周期。 通过这样的方式,我们能够实现Hibernate Dao层的自动事务管理,让...
5. 开启声明式事务:在Service层的方法上使用`@Transactional`注解,表明该方法需要在事务中执行。 6. 实际业务逻辑:在Service层的方法内部,通过SqlSessionTemplate执行SQL语句,进行数据操作。 7. 提交或回滚事务...
防止在一些意外(例如说突然断电)的情况下出现乱数据,防止数据库数据出现问题。 如:银行转帐。A账户减少的钱要加到B账户上,若A这边减了钱,B那边却还是一样的数,这就出大问题: 如:要添加多条数据,程序要求必须...
### Spring配置在DAO和事务层知识点详解 #### 一、Spring框架中的事务管理机制 Spring 框架提供了强大的事务管理功能,支持多种事务管理方式,包括编程式事务管理和声明式事务管理。其中,声明式事务管理是通过...
本案例使用纯JDBC+三层架构,演示在业务逻辑层中使用事务的方式. 导言:如何脱离框架,在使用了dao模式的项目中在业务逻辑层中使用jdbc事务?又如何保证每个dao方法的Connection对象统一且不被关闭?如何确保在多线程环境...
在使用JPA的SERVICE层,配置事务是非常重要的。DWR调用结束时,由于默认情况下EntityManager会在方法执行完毕后关闭,这可能导致延迟初始化(lazy-init)属性失效,因为在浏览器端试图访问这些属性时,数据库连接...
在手动控制事务时,需要在 Service 层中关心 Connection 或 Session 等对象,但这并不是 Service 层应该关心的。使用 Spring 可以将事务管理与业务逻辑分离,使得业务代码不受污染。 Spring 的事务管理器提供了...
`<tx:annotation-driven>`元素启用基于注解的事务管理,使得在Service层的类方法上可以使用`@Transactional`注解来声明事务边界。 接下来,我们关注`用Hibernate和Spring开发事务持久层`这个主题。在实际项目中,...
例如,使用Spring的PlatformTransactionManager接口,通过TransactionTemplate或直接在Service层使用@Transactional注解进行事务管理。 3. **声明式事务模型**:这是更推荐的方式,事务管理与业务逻辑分离,使得...
当Spring管理事务时,Hibernate的Session将在事务范围内打开和关闭,保证了数据的一致性。 至于Struts,它是SSH框架的前端控制器,主要负责请求的转发和视图的渲染。在加入事务支持的过程中,Struts并不直接参与...