spring声明式事务管理方式( 基于tx和aop名字空间的xml配置+@Transactional注解)

1. 声明式事务管理分类

声明式事务管理也有两种常用的方式,

一种是基于tx和aop名字空间的xml配置文件,另一种就是基于@Transactional注解。

显然基于注解的方式更简单易用,更清爽。

 

2. spring事务特性

spring所有的事务管理策略类都继承自org.springframework.transaction.PlatformTransactionManager接口

其中TransactionDefinition接口定义以下特性:事务隔离级别、事务传播行为、事务超时、事务只读属性、spring事务回滚规则等;

其实这些特性的介绍,网上一堆,在这我就不再啰嗦了,接下来我只想告诉你到底如何使用。

 

3. 声明式事务管理配置两种方式

如下都将以mybatis为例。

3.1 基于@Transactional注解的

1、首先来看一段代码 spring.xml

<!-- MyBatis begin --><!-- 1、mybatis文件配置,扫描所有mapper文件 --><bean class="org.mybatis.spring.SqlSessionFactoryBean"><!-- 设置MyBatis核心配置文件 --><property name="configLocation" value="classpath:resources/mybatis/mybatis-config.xml" /><!-- 设置数据源 --><property name="dataSource" ref="dataSource" /><!-- 它表示我们的Mapper文件存放的位置,当我们的Mapper文件跟对应的Mapper接口处于同一位置的时候可以不用指定该属性的值。 --><property name="mapperLocations" value="classpath:/mappings/**/*.xml" /><!-- 那么在Mapper文件里面就可以直接写对应的类名 而不用写全路径名了  --><!-- 跟mybatis中<typeAliases>作用一样 --><!-- <property name="typeAliasesPackage" value="com.jeenotes.ssm.pojo"/> --></bean><!-- 2、spring与mybatis整合配置,扫描所有dao,在单数据源的情况下可以不写sqlSessionFactoryBeanName --><bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /><!-- 设置Mapper扫描包,注意扫描的是java-dao-接口文件,不是xml --><property name="basePackage" value="com.jeenotes.ssm.dao" /></bean><!-- 3、定义事务 --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" /></bean><!-- 4、开启事务控制的注解支持,配置 Annotation 驱动,扫描@Transactional注解的类定义事务  --><tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/><!-- MyBatis end -->

这个文件时spring和mybatis配置中的,细心的你可能会发现,这1234,4个配置之间通过id存在关联关系的。

2、添加tx名字空间

xmlns:aop="http://www.springframework.org/schema/aop" 
xmlns:tx="http://www.springframework.org/schema/tx"  
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"

补充一下:添加到spring.xml上边的头部分,至于不明白xmlns,xmlns:xsi,xsi:schemaLocation等含义的同学,可以考虑看一下这篇文章了。

关于XML文档的xmlns、xmlns:xsi和xsi:schemaLocation详解

3、基于注解式小结

综上,MyBatis自动参与到spring事务管理中,无需额外配置,只要org.mybatis.spring.SqlSessionFactoryBean引用的数据源与DataSourceTransactionManager引用的数据源一致即可,也就是那些id要对应起来,否则事务管理会不起作用。

 

3.2 基于tx和aop名字空间的xml配置式

同样还是以mybatis为例,主要为aop切面配置,只看xml就可以了

注意:通常这种方式的配置我们都需要再创建一个xml文件:spring-trans.xml

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd 
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd"
><!-- 事务管理器 --><bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><!-- 数据源 --><property name="dataSource" ref="dataSource" /></bean><!-- 通知 --><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><!-- 传播行为 --><tx:method name="save*" propagation="REQUIRED" /><tx:method name="insert*" propagation="REQUIRED" /><tx:method name="add*" propagation="REQUIRED" /><tx:method name="create*" propagation="REQUIRED" /><tx:method name="delete*" propagation="REQUIRED" /><tx:method name="update*" propagation="REQUIRED" /><tx:method name="find*" propagation="SUPPORTS" read-only="true" /><tx:method name="select*" propagation="SUPPORTS" read-only="true" /><tx:method name="get*" propagation="SUPPORTS" read-only="true" /></tx:attributes></tx:advice><!-- 切面 --><aop:config><aop:advisor advice-ref="txAdvice"pointcut="execution(* com.jeenotes.ssm.service.*.*(..))" /></aop:config> </beans>

4. 声明式事务配置总结

通过上方步骤三的配置相信你已经学会如何配置声明式事务管理了,最后总结一下:

1、首先要明确上边的两种方式都是声明式事务管理的表现形式,思路千万不要乱。

2、两种方式配置后的使用规则

2.1、通过3.1第一种的配置,以后就可以在类、或者方法上使用@Transactional注解了(相信有的小伙伴还不知道该注解可以用在方法或者类上边吧),

加入该注解的类或者方法,在执行过程中就会加入到同一事务中,同生共死。

通常你会看到这样的写法,@Transactional(readOnly = true),不得不补充一下@Transactional的属性

属性类型描述
valueString可选的限定描述符,指定使用的事务管理器
propagationenum: Propagation可选的事务传播行为设置
isolationenum: Isolation可选的事务隔离级别设置
readOnlyboolean读写或只读事务,默认读写
timeoutint (in seconds granularity)事务超时时间设置
rollbackForClass对象数组,必须继承自Throwable导致事务回滚的异常类数组
rollbackForClassName类名数组,必须继承自Throwable导致事务回滚的异常类名字数组
noRollbackForClass对象数组,必须继承自Throwable不会导致事务回滚的异常类数组
noRollbackForClassName类名数组,必须继承自Throwable不会导致事务回滚的异常类名字数组

 

2.2、通过3.2第二种的配置,会对方法名有要求,在上方的配置中举个例子,

<tx:method name="save*" propagation="REQUIRED" />,比如如果saver中方法名是以save开头的就会加入事务。

@Service
public class ItemCatServiceImpl implements ItemCatService {@Autowiredprivate TbItemCatDao itemCatDao;@Overridepublic void saveItemCat(EasyUITreeNode node) {itemCatDao.save(node);}
}

不知道你是否会好奇propagation属性,该属性里的属性值你可以理解成@Transactional注解属性值,如下补充一下

事务传播行为类型

说明

REQUIRED

如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。

SUPPORTS

支持当前事务,如果当前没有事务,就以非事务方式执行。

MANDATORY

使用当前的事务,如果当前没有事务,就抛出异常。

REQUIRES_NEW

新建事务,如果当前存在事务,把当前事务挂起。

NOT_SUPPORTED

以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

NEVER

以非事务方式执行,如果当前存在事务,则抛出异常。

NESTED

如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类 似的操作。

3、项目中的使用选择。

在实际项目中,这两种方式采用哪一种实现效果都一样,其实到底采用哪一种要看项目需求,重要的是往往并不是你去配置,所以你只需要知道有这两种方式就行喽。

 

本文地址:http://www.cnblogs.com/niceyoo/articles/8732891.html

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/414786.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle中如何设置主键并且让其自动增长

1、创建数据库 create table USERINFO ( USERNO NUMBER not null, USERNAME NVARCHAR2(20), USERPWD NVARCHAR2(20) ) 2、创建触发器 create sequence SEQ_Userinf start with 1 increment by 1 nomaxvalue nominvalue nocache; CREATE OR REPLACE TRIGGER tg_test BEFORE …

工作228:小程序学习2开始布局页面2

<template><view class"box u-p-l-35 u-p-r-35 "><view class"title"><text>请选择您要管理的市场</text></view><view :class" [u-flex,u-row-center,{choose_market: selectIndex 0},{market : selectIndex…

AngularJs通过路由传参解决多个页面资源浪费问题

在实际开发中会遇到很多类似模块界面大体都一致只是极少的细节部分不一样&#xff0c;这时不管是在html页面还有js及数据交互的时候我们就没必要因为这些不同的页面分出不同的文件&#xff0c;这样很浪费内存及效率&#xff0c;于是我在开发中想到一种办法&#xff1a;通过ng路…

mybatis BindingException: Invalid bound statement (not found)

错误截图 解决措施 此异常的原因是由于mapper接口编译后在同一个目录下没有找到mapper映射文件而出现的。 通常我们在配置SqlSessionFactory时会有如配置 1 <!-- 配置SqlSessionFactory -->2 <bean class"org.mybatis.spring.SqlSessionFactoryBean">…

myeclipse快捷生成代码块

1、快捷键啊 altshifts 2、右键 -——Source

前端学习(2712):重读vue电商网站32之让菜单栏展开与折叠

通过点击一个按钮&#xff0c;让侧边栏进行展开与折叠。通过 isCollapse 的值来动态变化侧边栏的宽度。 其中 cursor: pointer 设置是为了让鼠标放在折叠与展开处会有一个手指指向。 letter-spacing: 0.2em 是为了让 ||| 有一定间隔

Myeclipse下Maven的配置

1.配置    window--Preferences JDK的配置(执行命令&#xff0c;控制台可能无法输出) -Dmaven.multiModuleProjectDirectory$MAVEN_HOME 新建 Maven Project 转载于:https://www.cnblogs.com/xdalsh/p/8399299.html

Hibernate访问数据库,HibernateTemplate操作数据库,实现增删改查

1、首先创建封装Hibernate的Dao类 import java.io.Serializable; import java.util.List; import javax.annotation.Resource; import org.springframework.orm.hibernate5.HibernateTemplate; import org.springframework.stereotype.Component; Component public class U…

前端学习(2713):重读vue电商网站33之实现首页路由重定向

我们想要在登录之后重定向到 /welcome 路径&#xff0c;于是需要添加子路由children 属性&#xff0c;然后设置 redirect重定向到我们的子路由。 然后在我们组件 Home.vue 的右侧主体区域&#xff0c;放置一个路由占位符 router-view 即可。

@Value(${xxxx})注解的配置及使用

代码中的用法 Spring 通过Value注解获取*.porperties文件code的内容&#xff0c;然后赋值给使用该注解的Code属性上。 Value("${code}") private String Code; 看一下这个resource.properties文件&#xff08;resource为文件名称&#xff09; code002 spring中的配置…

国家语言,语言代码,locale id对应表

国家语言&#xff0c;语言代码&#xff0c;locale id对应表。比如 en_US对应的id为1033&#xff0c; 中文的localezh_CN&#xff0c;id2052. LocaleLanguagecodeLCIDstringLCIDDecimalLCIDHexadecimalCodepageAfrikaansafaf10784361252Albaniansqsq1052 1250Amharicamam1118 A…

myeclipse链接数据库,SQL语句实现增删改查

1、创建properties文件 #oracle #driveroracle.jdbc.OracleDriver #urljdbc\:oracle\:thin\:localhost\:1521\:xe #usernamesystem #passwordmanager #mysql drivercom.mysql.jdbc.Driver urljdbc\:mysql\://192.168.0.121\:3306/test?user\root&password\root&chara…

前端学习(2714):重读vue电商网站34之侧边栏路由改造

通过给侧边栏设置 router 属性为 true&#xff0c;我们就能开启 vue-router 路由模式&#xff0c;然后将我们二级菜单的 index 属性绑定我们的数据 path 即可。

(转)spring中的拦截器(HandlerInterceptor+MethodInterceptor)

1. 过滤器跟拦截器的区别 在说拦截器之前&#xff0c;不得不说一下过滤器&#xff0c;有时候往往被这两个词搞的头大。 其实我们最先接触的就是过滤器&#xff0c;还记得web.xml中配置的<filter>吗~ 你应该知道spring mvc的拦截器是只拦截controller而不拦截jsp,html 页…

ASP.NET Core源码学习(一)Hosting

ASP.NET Core源码的学习&#xff0c;我们从Hosting开始&#xff0c; Hosting的GitHub地址为&#xff1a;https://github.com/aspnet/Hosting.git 朋友们可以从以上链接克隆或是下载。 为什么是从Hosting开始学习呢&#xff1f;我们来看看ASP.NET Core MVC项目中的Pragram.CS中的…

前端学习(2715):重读vue电商网站35之在sessionStorage保存左侧菜单栏的激活状态

为了让我们点击二级菜单时&#xff0c;会有一个激活效果&#xff0c;而且是保持状态&#xff0c;我们需要将利用 element-ui 菜单栏相关 default-active 属性&#xff0c;来让菜单保持激活。 由于每个二级菜单都有一个路由链接&#xff0c;不妨将路由路径 path 存储在 sessionS…

Struts2的通配符配置方式

Struts2的Action类很有意思&#xff0c;你可以使用3种方式来实现具体的Action类&#xff1a; 让你的Action类继承自ActionSupport类&#xff08;项目中最常用这种方式&#xff0c;因为ActionSupport类中定义了很多帮助方法&#xff09;让你的Action类实现Action接口使用POJO的…

spring拦截器-过滤器的区别

1. 理解 拦截器 &#xff1a;是在面向切面编程的时候&#xff0c;在你的 service 或者一个方法前调用一个方法&#xff0c;或者在方法后调用一个方法&#xff1b;比如动态代理就是拦截器的简单实现&#xff0c;在你调用方法前打印出字符串&#xff08;或者做其它业务逻辑的操作…

前端学习(2716):重读vue电商网站36之slot插槽使用

项目需求&#xff1a;由于用户列表状态后台返回的是 true/false&#xff0c;无法进行渲染&#xff0c;而我们需要的是有一个Switch开关来控制我们的状态。添加一个template 模板后&#xff0c;此时就可以用 slot-scope 作用域插槽来获取我们数据列表中的每一行数据&#xff0c;…

jsp调用struts,jsp调用action,action获取表单提交的参数

自定义action类。LgqAction&#xff1a; Component Scope(value"prototype") public class LgqAction { private Connection conn null; private PreparedStatement pstmt null; private ResultSet rs null; public String execut…