事先准备:
配置数据源对象
用<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配置里配置事务的更多相关文章

  1. spring基于xml的声明式事务控制配置步骤

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  2. 不在JPA 的 persistence.xml 文件里配置Entity class的解决的方法

     在Spring 集成 Hibernate 的JPA方式中,须要在persistence配置文件里定义每个实体类.这样很地不方便.2种方法能够解决此问题: 这2种方式都能够实现不用在persist ...

  3. 曹工说Spring Boot源码(16)-- Spring从xml文件里到底得到了什么(aop:config完整解析【上】)

    写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...

  4. 曹工说Spring Boot源码(17)-- Spring从xml文件里到底得到了什么(aop:config完整解析【中】)

    写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...

  5. duilib中加入自己定义控件之后怎么可以在xml文件里配置使用

    加入自己定义控件可能有两种不同的情况: 1.  在duilib库中加入的自己定义控件. 2.  在我们的应用程序中自己重写了一个控件. 以下開始解说不同的情况下怎么才干支持在xml文件配置控件: 1. ...

  6. spring基于XML的声明式事务控制

    <?xml version="1.0" encoding="utf-8" ?><beans xmlns="http://www.sp ...

  7. 曹工说Spring Boot源码(15)-- Spring从xml文件里到底得到了什么(context:load-time-weaver 完整解析)

    写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...

  8. Spring在xml配置里配置事务

    事先准备:配置数据源对象用<bean>实例化各个业务对象. 1.配置事务管理器. <bean id="transactionManager" class=&quo ...

  9. 阶段3 2.Spring_10.Spring中事务控制_6 spring基于XML的声明式事务控制-配置步骤

    环境搭建 新建工程 把对应的依赖复制过来 src下内容复制 配置spring中的声明事物 找到bean.xml开始配置 配置事物管理器 里面需要注入DataSource 2-配置事物通知 需要先导入事 ...

随机推荐

  1. 思考在伟大的互联网世界中,我是谁?——By Me in 2016

    互联网伟大在哪里? 互联网的发明是不是伟大的,这个问题就如同这个世界上许许多多的问题一样,很大程度上取决于人们不同的经历.不同的见识,乃至不同的信念.不同的人生态度. 摘录网上的一段表述:“互联网(产 ...

  2. 关于mysql主从复制的概述与分类

    一.概述: 按照MySQL的同步复制特点,大体上可以分为三种类别: 1.异步复制: 2.半同步复制: 3.完全同步的复制: -------------------------------------- ...

  3. MySQL 数据备份,Pymysql模块(Day47)

    阅读目录 一.IDE工具介绍 二.MySQL数据备份 三.Pymysql模块 一.IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 下载链接:https:/ ...

  4. sqlserver导入excel的电话号码(身份证)变为科学计数解决方式

    如果excel中有一列存的是手机号码或者身份证号码,那么导入到sql中时,会把手机或者身份证当作数字格式对待,因而会以科学记数法的形式存在sqlserver表中,解决方式,先将excel文件另存为文本 ...

  5. maven依赖排除、顺序原则、版本统一管理

    <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core& ...

  6. Linux系统配置VI或VIM的技巧

    Linux系统配置VI或VIM的技巧作者:IT专家网论坛出处:IT专家网论坛2008-10-28 11:08配置VI和VIM的颜色显示,使它能够高亮度显示一些特别的单词,这对编写程序很有用⋯⋯ 1.V ...

  7. Android MVP Presenter 中引发的空指针异常

    一.概述 最近对 googlesamples/android-architecture 中的 MVP-dagger 进行了学习.对照项目的 MVP-dagger 分支,对 MVP-dagger 进行了 ...

  8. HDU 4370 - 0 or 1 (SPFA+思维)

    题意:给一个N*N的矩阵C,和一个N*N的只由0和1组成的矩阵X. X满足以下条件: 1.X 12+X 13+...X 1n=1  2.X 1n+X 2n+...X n-1n=1  3.任意 i (1 ...

  9. ASYNCAPI

    https://www.asyncapi.com Introduction AsyncAPI provides a specification that allows you to define Me ...

  10. linux命令(6/9):watch命令

    watch是一个非常实用的命令,基本所有的Linux发行版都带有这个小工具,如同名字一样,watch可以帮你监测一个命令的运行结果,省得你一遍遍的手动运行.在Linux下,watch是周期性的执行下个 ...