service方法内部事务如何控制?
现在要在service中的一个方法中调用多个接口,可能是内部接口也可能是外部接口,可能是操作数据库,也可能是操作其他资源,怎么实现让这个方法保证事务的一致性,实现事务回滚等。
我觉得这个还是要看你自己的业务了,你先要清楚你的业务是否需要全部回滚,然后还要明白事务的传播性和隔离性,我拿spring的事务给你举例下
spring事务的传播性:
propagation_requried spring的默认传播机制,如果外层有事务则当前事务加入到外层事务,一块提交一块回滚,如果外层没有事务则当前开启一个新事务
propagation_requried_new,该传播机制是每次新开启一个事务,同时把外层的事务挂起,当前新事务执行完毕后在恢复上层事务的执行。
propagation_supports,该传播机制如果外层有事务则加入该事务,如果不存在也不会创建新事务,直接使用非事务方式执行
propagation_not_supported,该传播机制不支持事务,如果外层存在事务则挂起外层事务 ,然后执行当前逻辑,执行完毕后,恢复外层事务
propagation_never该传播机制不支持事务,如果外层存在事务则直接抛出异常
propagation_mandatory该传播机制是说配置了该传播性的方法只能在已经存在事务的方法中被调用,如果在不存在事务的方法中被调用,会抛出异常
propagation_nested该传播机制特点是可以保存状态保存点,当事务回滚后会回滚到某一个保存点上,从而避免所有嵌套事务都回滚
你了解完上面这些传播性后,就可以根据自己的业务需要配置事务的传播性来控制事务的回滚
回到你的问题上,你这种service嵌套调用里,每一个service是否都使用了事务,每个service的事务设置的传播性是什么,然后对照上面每种传播性去分析吧。
最后关于事务的配置很简单,有基于注解的,也有基于xml的,我们项目中的事务控制在service层,用的是xml方式,你参考下:
<!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 配置事务属性 --> <tx:advice id="transactionAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="append*" propagation="REQUIRED" /> <tx:method name="insert*" propagation="REQUIRED" /> <tx:method name="save*" propagation="REQUIRED" /> <tx:method name="batchSave*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="modify*" propagation="REQUIRED" /> <tx:method name="edit*" propagation="REQUIRED" /> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="remove*" propagation="REQUIRED" /> <tx:method name="repair" propagation="REQUIRED" /> <tx:method name="delAndRepair" propagation="REQUIRED" /> <tx:method name="get*" propagation="SUPPORTS" /> <tx:method name="find*" propagation="SUPPORTS" /> <tx:method name="load*" propagation="SUPPORTS" /> <tx:method name="search*" propagation="SUPPORTS" /> <tx:method name="datagrid*" propagation="SUPPORTS" /> <tx:method name="*" propagation="SUPPORTS" /> </tx:attributes> </tx:advice>
上面的propagation属性就是配置spring事务的传播性,我贴一段spring-tx-4.0.xsd中的定义给你看下,是不是对应了我上面解释的7种传播性,希望能解决你的疑问
<xsd:attribute name="propagation" default="REQUIRED"> <xsd:annotation> <xsd:documentation source="java:org.springframework.transaction.annotation.Propagation"><![CDATA[The transaction propagation behavior.]]></xsd:documentation> </xsd:annotation> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:enumeration value="REQUIRED"/> <xsd:enumeration value="SUPPORTS"/> <xsd:enumeration value="MANDATORY"/> <xsd:enumeration value="REQUIRES_NEW"/> <xsd:enumeration value="NOT_SUPPORTED"/> <xsd:enumeration value="NEVER"/> <xsd:enumeration value="NESTED"/> </xsd:restriction> </xsd:simpleType> </xsd:attribute>
- 等 最代码怎么获取牛币啊?
- 完 谁来告诉我最代码上线的时间,答对者给5牛币,先来先得
- 等 牛友们,大家好,你们做程序员多久了?现在还好吗?
- 完 在微信打开的页面里进行app下载
- 等 最代码2014年欢乐聚声会
- 完 mysql如何查询表数据并且对3个字段降序的SQL?
- 完 最代码牛币机制改革
- 完 成功的在bae上使用了自定义运行环境 jetty+nginx的组合,大家对jetty+nginx优化有哪些心得?
- 完 进来分享一下各位牛牛是如何加入最代码大家庭的?
- 等 为什么java BufferedImage类处理大图直接抛出内存溢出的异常?
- 等 最代码是否开发手机app客户端?
- 完 java程序员学习哪些java的技术?java有哪些框架?都能做哪方面的开发?
- 等 php格式网页文件怎么运行?
- 等 Java volatile值获取的问题
- 等 前端vue,拦截了登录后台后,返回的token,requests拦截token,但是发送请求的时候,就出现跨越异常
- 等 大专本科计算机科班怎么找到Java工作?
- 等 eclipse怎么把三个java swing游戏项目合成一个项目?
- 完 伙伴们,大家都有什么好的解压方式么,分享一下~
- 完 三四线城市,6、7k,运维工作,索然无味,想去辞职上培训,各位牛牛有什么建议嘛
- 等 jsp页面输入中文变成问号
- 等 JPA在线上运行一段时间后报错Caused by: java.lang.IncompatibleClassChangeError: null
- 等 PHP 这个规则用preg_match_all怎么写
- 等 大佬们,有没有知道Alfresco如何配置LDAP登录呢?
- 等 php的install目录是框架带的吗?
- 完 java web项目开发中spring service层直接调用service层还是dao层,哪个更合理?
- 完 springboot整合quartz job为什么不能注入service?
- 等 spring如何动态注入Service不同的bean实现类?
- 完 java web项目中dao和service前面为什么要有接口呢??
- 等 java TimerTask的run()方法里面如何调用service层里面的方法
- 完 mvc的设计模式中service、dao和mvc的关系是什么?
- 完 java web开发中事务的封装在Service层还是在DAO层做?那种比较常见?
- 完 请问一个WEB项目中关于常量定义的问题?
- 等 spring MVC中的@service和@autowired有什么联系么?
- 完 java如何调用第三方提供的web service接口?
- 完 spring mvc controller控制器如何控制service层事务?
- 等 Android如何开发简单的计算器并通过Service运算后显示到安卓手机前台界面?