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>

下面我们具体来看一下事务的传播性的几个值:

  • REQUIRED:业务方法需要在一个容器里运行。如果方法运行时,已经处在一个事务中,那么加入到这个事务,否则自己新建一个新的事务(这是Spring默认的选择)
  • NOT_SUPPORTED:声明方法不需要事务。如果方法没有关联到一个事务,容器不会为他开启事务,如果方法在一个事务中被调用,该事务会被挂起,调用结束后,原先的事务会恢复执行。
  • REQUIRESNEW:不管是否存在事务,该方法总汇为自己发起一个新的事务。如果方法已经运行在一个事务中,则原有事务挂起,新的事务被创建。
  • MANDATORY:该方法只能在一个已经存在的事务中执行,业务方法不能发起自己的事务。如果在没有事务的环境下被调用,容器抛出例外。
  • SUPPORTS:该方法在某个事务范围内被调用,则方法成为该事务的一部分。如果方法在该事务范围外被调用,该方法就在没有事务的环境下执行。
  • NEVER:该方法绝对不能在事务范围内执行。如果在就抛例外。只有该方法没有关联到任何事务,才正常执行。
  • NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务,则按REQUIRED属性执行。它使用了一个单独的事务,这个事务 拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对DataSourceTransactionManager事务管理器起效。

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错误,数据回滚,数据库并没有删除。说明配置的事务生效了。

往期推荐:

史上最强Tomcat8性能优化

日均5亿查询量的京东到家订单中心,为什么舍MySQL用ES?

四张图带你了解Tomcat系统架构--让面试官颤抖的Tomcat回答系列!

“12306”架构到底有多牛逼--秒杀系统的艺术

阿里巴巴为什么能抗住90秒100亿?--服务端高并发分布式架构演进之路

B2B电商平台--ChinaPay银联电子支付功能

学会Zookeeper分布式锁,让面试官对你刮目相看

SpringCloud电商秒杀微服务-Redisson分布式锁方案

一只 有深度 有灵魂 的公众号0.0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值