文档章节

Spring MVC 事务管理 和 ssh 事务管理

wpb王鹏博
 wpb王鹏博
发布于 2015/06/08 15:17
字数 1066
阅读 103
收藏 1
点赞 0
评论 0

Spring事务的传播行为在service类前加上@Transactional,声明这个service所有方法需要事务管理。每一个业务方法开始时都会打开一个事务。 Spring默认情况下会对运行期例外(RunTimeException)进行事务回滚。这个例外是unchecked
如果遇到checked意外就不回滚。


如何改变默认规则:
1 checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class)
2 unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)
3 不需要事务管理的(只查询的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED)
在整个方法运行前就不会开启事务
可以加上:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true),这样就做成一个只读事务,可以提高效率。 各种属性的意义: REQUIRED:业务方法需要在一个容器里运行。如果方法运行时,已经处在一个事务中,那么加入到这个事务,否则自己新建一个新的事务。 NOT_SUPPORTED:声明方法不需要事务。如果方法没有关联到一个事务,容器不会为他开启事务,如果方法在一个事务中被调用,该事务会被挂起,调用结束后,原先的事务会恢复执行。REQUIRESNEW:不管是否存在事务,该方法总汇为自己发起一个新的事务。如果方法已经运行在一个事务中,则原有事务挂起,新的事务被创建。MANDATORY:该方法只能在一个已经存在的事务中执行,业务方法不能发起自己的事务。如果在没有事务的环境下被调用,容器抛出例外。SUPPORTS:该方法在某个事务范围内被调用,则方法成为该事务的一部分。如果方法在该事务范围外被调用,该方法就在没有事务的环境下执行。NEVER:该方法绝对不能在事务范围内执行。如果在就抛例外。只有该方法没有关联到任何事务,才正常执行。NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务,则按REQUIRED属性执行。它使用了一个单独的事务,这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对DataSourceTransactionManager事务管理器起效。


ssh 事务处理

首先是一个BaseDaoImpl,这个Dao集成了HibernateDaoSupport,实现了对于数据表的增删改查操作。
例如:修改方法:

public void modifyModel(Object model) throws UpdateException{
		try {
			super.getHibernateTemplate().update(model);
		} catch (Exception ex) {
			logger.error("PersistentBaseDAOImpl:" + model.getClass().getName());
			throw new UpdateException(ex);
		}
	}


都是类似这样的单个业务的逻辑。然后各个业务Dao通过Spring的bean配置,去使用这个BaseDao中的方法来完成自身不同的数据库操作。
如果有这样一个功能,执行UserAction,这个Action中的某个方法会调用UserDao中的getUserContent方法。
在getUserContent方法中,首先调用BaseDao的查询方法,获取了该用户存在,并合法。之后再去调用另一个Dao中的方法,如ContentDao中的getContent方法去获取该用户所发的文章。
总的来说就是在UserDao中的getUserContent方法内,进行了两次对数据库的操作。
那么将这个方法配置到Spring的事务管理中,这两个对数据库的操作就成为了一个事务,根据事务的原子性被统一的管理。
基本就是以下这个图:
UserAction--->UserDao.getUserContent()--即完成验证用户功能,又获取用户文章


现在遇到的是三层结构的逻辑。
UserAction--->UserService.getUserContent()
                 |---UserDao.fineUser()---验证用户
                 |---ContentDao.getContentByUserId()---获取用户文章
如果将UserDao和ContentDao配置在Spring的事务管理中,那么执行UserService中的方法,实际上是执行了两个不同的事务来完成这个逻辑。但是把UserService配置到事务中,感觉又不合逻辑,也没配过。

现在我看来,如果把整个逻辑定义为一个事务,必须要把Service层的方法配置在Spring的事务管理中了。





© 著作权归作者所有

共有 人打赏支持
wpb王鹏博
粉丝 5
博文 39
码字总数 102591
作品 0
武汉
程序员
spring mvc 事物失效

spring mvc 事物失效的原因: 各位侠士都知道,spring事物管理是一个很高大上的东西。 你需要首先了解的知识: 1 msyql 默认的MyISAM引擎是一种非事务性的引擎,提供高速存储和检索,以及全文...

james_lz ⋅ 2016/10/25 ⋅ 0

Spring AOP 日志拦截器的事务管理

如果要在方法执行前或后或抛出异常后加上一个自己的拦截器,或者一个环绕拦截器,在拦截器中执行一些操作,比如执行一些数据库操作,记录一些信 息,这些操作通过调用一个服务类的方法来执行...

哲别0 ⋅ 05/18 ⋅ 0

Spring编程式和声明式事务实例讲解

Java面试通关手册(Java学习指南):https://github.com/Snailclimb/JavaGuide 历史回顾: 可能是最漂亮的Spring事务管理详解 Spring事务管理 Spring支持两种方式的事务管理: 编程式事务管理...

snailclimb ⋅ 05/23 ⋅ 0

mybatis3+spring3.1M2 事务不起作用

今天搭建 myBatis3,spring3.1M2 普通的事务管理不起作用! JTA事务可以使用!!! 郁闷之极...... PS:我即将用 springMVC+ibatis 替代 SSH 不知道大家谁遇到过这样的问题?...

光石头 ⋅ 2011/06/25 ⋅ 7

JAVA SSH 框架介绍

SSH 为 struts+spring+hibernate 的一个集成框架,是目前较流行的一种JAVA Web应用程序开源框架。  Struts   Struts是一个基于Sun J2EE平台的MVC框架,主要是采用Servlet和JSP技术来实现的...

小梅菜鸟 ⋅ 2012/04/20 ⋅ 0

Spring MVC + Mybatis + Spring Aop声明式事务管理没有作用

在最近的一个项目中,采用springMVC、mybatis,发现一个很恼人的问题:事务管理不起作用!!网上查阅了大量的资料,尝试了各种解决办法,亦未能解决问题! applicationContext.xml配置: sp...

陶邦仁 ⋅ 2016/01/03 ⋅ 0

整合hibernate4到spring4mvc框架

1.总体设计思路 写一个HibernateDao的公共接口HibernateCommonDao,实现基本的增删改查HibernateCommonDaoImpl,所有的具体业务类DaoImpl都继承自HibernateCommonDaoImpl并且implements它自己...

阿宇_ ⋅ 2015/09/15 ⋅ 0

有关Spring3.x 整合myBatis3.1的轻量级框架简要说明

主题:有关Spring3.x 整合myBatis3.1的轻量级框架 对于现在主流的j2ee企业级开发而言,ssh(struts+hibernate+spring)依然是一个事实的标准。 由struts充当的mvc调度控制;hibernate的orm持...

后海 ⋅ 2013/02/01 ⋅ 0

spring 声明事物

采用的基本搭建环境:SpringMVC、MyBatis、MySQL、tomcat Spring事务管理分解了传统的全局事务管理和本地事务管理的劣势,使得在任何环境中都可以使用统一的事务管理模型,你可以写一次代码,...

訫犫 ⋅ 2016/01/15 ⋅ 0

基于可靠消息方案的分布式事务(二):Java中的事务

前言:在上一篇文章 基于可靠消息方案的分布式事务:Lottor介绍 中介绍了常见的分布式事务的解决方案以及笔者基于可靠消息方案实现的分布式事务组件Lottor的原理,并展示了应用的控制台管理。...

aoho ⋅ 06/01 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

从 Confluence 5.3 及其早期版本中恢复空间

如果你需要从 Confluence 5.3 及其早期版本中的导出文件恢复到晚于 Confluence 5.3 的 Confluence 中的话。你可以使用临时的 Confluence 空间安装,然后将这个 Confluence 安装实例升级到你现...

honeymose ⋅ 今天 ⋅ 0

用ZBLOG2.3博客写读书笔记网站能创造今日头条的辉煌吗?

最近两年,著名的自媒体网站今日头条可以说是火得一塌糊涂,虽然从目前来看也遇到了一点瓶颈,毕竟发展到了一定的规模,继续增长就更加难了,但如今的今日头条规模和流量已经非常大了。 我们...

原创小博客 ⋅ 今天 ⋅ 0

MyBatis四大核心概念

本文讲解 MyBatis 四大核心概念(SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapper)。 MyBatis 作为互联网数据库映射工具界的“上古神器”,训有四大“神兽”,谓之:Sql...

waylau ⋅ 今天 ⋅ 0

以太坊java开发包web3j简介

web3j(org.web3j)是Java版本的以太坊JSON RPC接口协议封装实现,如果需要将你的Java应用或安卓应用接入以太坊,或者希望用java开发一个钱包应用,那么用web3j就对了。 web3j的功能相当完整...

汇智网教程 ⋅ 今天 ⋅ 0

2个线程交替打印100以内的数字

重点提示: 线程的本质上只是一个壳子,真正的逻辑其实在“竞态条件”中。 举个例子,比如本题中的打印,那么在竞态条件中,我只需要一个方法即可; 假如我的需求是2个线程,一个+1,一个-1,...

Germmy ⋅ 今天 ⋅ 0

Springboot2 之 Spring Data Redis 实现消息队列——发布/订阅模式

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式,这里利用redis消息“发布/订阅”来简单实现订阅者模式。 实现之前先过过 redis 发布订阅的一些基础概念和操...

Simonton ⋅ 今天 ⋅ 0

error:Could not find gradle

一.更新Android Studio后打开Project,报如下错误: Error: Could not find com.android.tools.build:gradle:2.2.1. Searched in the following locations: file:/D:/software/android/andro......

Yao--靠自己 ⋅ 昨天 ⋅ 0

Spring boot 项目打包及引入本地jar包

Spring Boot 项目打包以及引入本地Jar包 [TOC] 上篇文章提到 Maven 项目添加本地jar包的三种方式 ,本篇文章记录下在实际项目中的应用。 spring boot 打包方式 我们知道,传统应用可以将程序...

Os_yxguang ⋅ 昨天 ⋅ 0

常见数据结构(二)-树(二叉树,红黑树,B树)

本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树 写在前面 本文所有图片均截图自coursera上普林斯顿的课程《Algorithms, Part I》中的Slides 相关命题的证明可参考《算法(第...

浮躁的码农 ⋅ 昨天 ⋅ 0

android -------- 混淆打包报错 (warning - InnerClass ...)

最近做Android混淆打包遇到一些问题,Android Sdutio 3.1 版本打包的 错误如下: Android studio warning - InnerClass annotations are missing corresponding EnclosingMember annotation......

切切歆语 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部