Spring 在xml配置里配置事务
事先准备:
配置数据源对象
用<bean>实例化各个业务对象。
1.配置事务管理器。
<bean id="transactionManager" class="org.springframework.jdbc.datasourceManager">
<property name="datasource" ref="datasource"></property>
</bean>
2.配置事务属性
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="方法名" propagation="REQUIRES_NEW"/> <!--新开事务-->
<tx:method name="*"/> <!--使用原有事务-->
</tx:attributes>
</tx:advice>
3.配置事务切入点,注入事务属性
<aop:config>
<aop:pointcut expression="execution(.......)" id="txPointCut"/>
<aop:advisor advice-ref="txtAdvice" pointcut-ref="txtPointCut"/>
</aop:config>
实例:
准备工作:导入c3p0、Spring框架、Mysql、AOP的jar包,并配置好。
db.properties
driverClass=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql://localhost:3306/mydb
user=root
password=
minPoolSize=5
maxPoolSize=20
initialPoolSize=5
三个接口
package com.itnba.maya.dao;
public interface IInfoDao {
public void delete(String code);
}
package com.itnba.maya.dao;
public interface IWorkDao {
public void deleteInfocode(String code);
}
package com.itnba.maya.dao;
public interface IInfoService {
public void delete(String code);
}
接口的实现类
package com.itnba.maya.daoimp; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository; import com.itnba.maya.dao.IInfoDao; public class InfoDao implements IInfoDao { private JdbcTemplate j;
public JdbcTemplate getJ() {
return j;
}
public void setJ(JdbcTemplate j) {
this.j = j;
}
@Override
public void delete(String code) {
// 故意设置一个错误
if(code.equals("p008")){
int n=1/0;
} String sql="delete from info where code=?";
j.update(sql,code);
} }
package com.itnba.maya.daoimp; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository; import com.itnba.maya.dao.IWorkDao; public class WorkDao implements IWorkDao { private JdbcTemplate j; public JdbcTemplate getJ() {
return j;
} public void setJ(JdbcTemplate j) {
this.j = j;
} public void deleteInfocode(String code) { String sql="delete from work where infocode=?";
j.update(sql,code);
} }
package com.itnba.maya.daoimp; import com.itnba.maya.dao.IInfoDao;
import com.itnba.maya.dao.IInfoService;
import com.itnba.maya.dao.IWorkDao; public class InfoService implements IInfoService { private IInfoDao infoDao;
public IInfoDao getInfoDao() {
return infoDao;
}
public void setInfoDao(IInfoDao infoDao) {
this.infoDao = infoDao;
}
public IWorkDao getWorkdao() {
return workdao;
}
public void setWorkdao(IWorkDao workdao) {
this.workdao = workdao;
}
private IWorkDao workdao;
public void delete(String code) { infoDao.delete(code);
workdao.deleteInfocode(code); } }
XML配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
default-autowire="byName"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd"> <!-- 引入db.properties文件 -->
<context:property-placeholder location="classpath:db.properties"/>
<!-- 生成连接池 -->
<bean class="com.mchange.v2.c3p0.ComboPooledDataSource" id="dataSource">
<property name="driverClass" value="${driverClass}"></property>
<property name="jdbcUrl" value="${jdbcUrl}"></property>
<property name="user" value="${user}"></property>
<property name="password" value="${password}"></property>
<property name="minPoolSize" value="${minPoolSize}"></property>
<property name="maxPoolSize" value="${maxPoolSize}"></property>
<property name="initialPoolSize" value="${initialPoolSize}"></property>
</bean>
<!-- 生成JdbcTemplate -->
<bean class="org.springframework.jdbc.core.JdbcTemplate" id="j">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置实体类 -->
<bean class="com.itnba.maya.daoimp.InfoDao" id="infoDao">
<property name="j" ref="j"></property>
</bean>
<bean class="com.itnba.maya.daoimp.WorkDao" id="workDao">
<property name="j" ref="j"></property>
</bean>
<bean class="com.itnba.maya.daoimp.InfoService" id="service">
<property name="infoDao" ref="infoDao"></property>
<property name="workdao" ref="workDao"></property>
</bean> <!-- 配置事务管理器 -->
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<tx:advice id="advice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED"/><!-- *是对所有方法都加 -->
</tx:attributes>
</tx:advice>
<!-- 用切点把事务切进去 -->
<aop:config>
<aop:pointcut expression="execution(* com.itnba.maya.daoimp..*.*(..))" id="pointcut"/>
<aop:advisor advice-ref="advice" pointcut-ref="pointcut"/>
</aop:config> </beans>
mian函数测试事务有没有生效:
package com.itnba.maya.daoimp; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import com.itnba.maya.dao.IInfoService; public class Test {
private static ApplicationContext context=null; private static IInfoService infoservice=null; static{
context=new ClassPathXmlApplicationContext("beans.xml");
infoservice=(IInfoService) context.getBean("service"); } public static void main(String[] args) { infoservice.delete("p008"); } }
结果除0错误,数据回滚,数据库并没有删除。说明配置的事务生效了。



Spring 在xml配置里配置事务的更多相关文章
- spring基于xml的声明式事务控制配置步骤
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- 不在JPA 的 persistence.xml 文件里配置Entity class的解决的方法
在Spring 集成 Hibernate 的JPA方式中,须要在persistence配置文件里定义每个实体类.这样很地不方便.2种方法能够解决此问题: 这2种方式都能够实现不用在persist ...
- 曹工说Spring Boot源码(16)-- Spring从xml文件里到底得到了什么(aop:config完整解析【上】)
写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...
- 曹工说Spring Boot源码(17)-- Spring从xml文件里到底得到了什么(aop:config完整解析【中】)
写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...
- duilib中加入自己定义控件之后怎么可以在xml文件里配置使用
加入自己定义控件可能有两种不同的情况: 1. 在duilib库中加入的自己定义控件. 2. 在我们的应用程序中自己重写了一个控件. 以下開始解说不同的情况下怎么才干支持在xml文件配置控件: 1. ...
- spring基于XML的声明式事务控制
<?xml version="1.0" encoding="utf-8" ?><beans xmlns="http://www.sp ...
- 曹工说Spring Boot源码(15)-- Spring从xml文件里到底得到了什么(context:load-time-weaver 完整解析)
写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...
- Spring在xml配置里配置事务
事先准备:配置数据源对象用<bean>实例化各个业务对象. 1.配置事务管理器. <bean id="transactionManager" class=&quo ...
- 阶段3 2.Spring_10.Spring中事务控制_6 spring基于XML的声明式事务控制-配置步骤
环境搭建 新建工程 把对应的依赖复制过来 src下内容复制 配置spring中的声明事物 找到bean.xml开始配置 配置事物管理器 里面需要注入DataSource 2-配置事物通知 需要先导入事 ...
随机推荐
- myeclipse如何删除自带Javaee里面jar包
myeclipse是我们在使用Java开发时的一款不错的集成开发环境软件,一般在开发web项目的时候,都要引入相关的jar包,javaee包就是其中一个,有时候其里面的jar包可能与我们需要的不匹配, ...
- yum速查
yum命令是在Fedora和RedHat以及SUSE中基于rpm的软件包管理器,它可以使系统管理人员交互和自动化地更细与管理RPM软件包, 能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖 ...
- python全栈开发之OS模块的总结
OS模块 1. os.name() 获取当前的系统 2.os.getcwd #获取当前的工作目录 import os cwd=os.getcwd() # dir=os.listdi ...
- javascript Date对象 之 设置时间
之前对js的date对象总是感觉熟悉,而不愿细细深究其所以然,所以每当自己真正应用起来的时候,总会糊里糊涂的,今日花费2个小时的时间仔细钻研了一下,感觉 豁然开朗,故,以此记录,一来 供以后查阅,二来 ...
- Windows 下c获取文件目录
由于要插数据库,构建sql语句,需要文件名,在网上找了半天,无奈都是Linux下的专用函数,伤心,,还有那个下载URL ,还木搞好,就要走啦,心焦哇 #include<iostream> ...
- HashMap的简单源码分析(看了大佬的源码,基于1.7) put方法
参考博客: https://blog.csdn.net/eson_15/article/details/51158865 hashMap中的几个关键属性 //默认初始容量是16,必须是2的幂 stat ...
- Cookie应用参考
内容来自imooc.
- SpringBoot AOP控制Redis自动缓存和更新
导入redis的jar包 <!-- redis --> <dependency> <groupId>org.springframework.boot</gro ...
- iOS7中彻底隐藏status bar
用Xcode5开发新游戏,发现在iOS7中按照以前的方法隐藏status bar失效了. 想要彻底隐藏status bar,需要在info.plist中添加新行“View controller-bas ...
- 第十节课-RNN介绍
2017-08-21 这次的课程介绍了RNN的相关知识: 首先是RNN的几种模型: 分别又不同的应用场景,包括机器翻译,视频的分类... RNN的解释: 主要的特点就是用到了上一个隐含状态的信息,所以 ...