Spring 事务入门

定义:

一系列的动作,被当成一个单独的工作单元,要么都完成,要么全部不起作用。

之前的事务处理:JDBC与Hibernate中的事务处理——与try...catch...finally...一起用。
Spring中的事务处理:编程式,声明式。
Spring从事务管理的API中抽象出一套独立事务机制。事务管理代码能独立于特点的具体技术。

使用方法:

建立beans.xml

准备工作:配置数据源对象。

<!-- 生成数据连接池 -->
<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="jdbcTemplate">
    <property name="dataSource" ref="dataSource"></property>
</bean>

1.配置事务管理器。

DataSourceTransactionManager类
dataSource属性注入

<!-- 配置事务管理器-->
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager">
    <property name="dataSource" ref="dataSource"></property>
</bean>

2.在配置文件中启用事务注解

把tx命名空间加进来。

<!-- 启动事务注解 -->
<tx:annotation-driven transaction-manager="transactionManager"/>

3.添加事务注解。在类中使用的方法上添加这个注解:@Transactional

  @Transactional//事务注解
    @Override
    public void delete(String code) {
        workDao.deleteByInfoCode(code);
        infoDao.delete(code);
    }

下面看一个实例:

准备工作:导入c3p0、Spring框架、Mysql的jar包,并配置好

db.properties

driverClass=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql://localhost:3306/mydb
user=root
password=
minPoolSize=5
maxPoolSize=20
initialPoolSize=5

beans.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:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    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-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="jdbcTemplate">
    <property name="dataSource" ref="dataSource"></property>
</bean>

</beans>

1.做两个接口IInfoDao和IWorkDao

package maya.dao;

public interface IInfoDao {
    public void delete(String code);
}
package maya.dao;

public interface IWorkDao {
    public void deleteByInfoCode(String code);
}

2.做两个类继承以上两个接口:InfoDao和WorkDao

package maya.daolmpl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import maya.dao.IInfoDao;
@Repository
public class InfoDao implements IInfoDao {
      @Autowired//自动装配beans.xml中的jdbcTemplate
    private JdbcTemplate jdbcTemplate;
      @Override
    public void delete(String code) {

        String sql = "delete from info where code=?";
        jdbcTemplate.update(sql,code);
        //故意写一个错误代码
        int n = 5/0;
    }
}    
package maya.daolmpl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import maya.dao.IWorkDao;
@Repository
public class WorkDao implements IWorkDao {
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Override
    public void deleteByInfoCode(String code) {
        String sql = "delete from work where infoCode=?";
        jdbcTemplate.update(sql,code);
    }

}

3.向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:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    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-4.3.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">

<!--扫描以下包里的类,以备使用-->
<context:component-scan base-package="maya.daolmpl,maya.servicelmpl"></context:component-scan>

<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="jdbcTemplate">
    <property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置事务管理器 -->
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager">
    <property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 启动事务注解 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>

4.建立业务接口并用类继承

IInfoService接口

package maya.service;

public interface IInfoService {
    public void delete(String code);
}

InfoService类

package maya.servicelmpl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import maya.dao.IInfoDao;
import maya.dao.IWorkDao;
import maya.daolmpl.WorkDao;
import maya.service.IInfoService;
@Service
public class InfoService implements IInfoService {
    @Autowired
    private IWorkDao workDao;
    @Autowired
    private IInfoDao infoDao;

    @Transactional//为以下方法添加事务注解
    @Override
    public void delete(String code) {
        workDao.deleteByInfoCode(code);
        infoDao.delete(code);
    }
}

5.创建测试类并运行

package maya.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import maya.dao.IInfoDao;
import maya.dao.IWorkDao;
import maya.service.IInfoService;

public class Test {
    private static ApplicationContext context = null;
    private static IInfoDao infoDao = null;
    private static IWorkDao workDao = null;
    private static IInfoService infoService = null;

    static {
        context = new ClassPathXmlApplicationContext("beans.xml");
        infoDao = (IInfoDao)context.getBean("infoDao");
        workDao = (IWorkDao)context.getBean("workDao");
        infoService = (IInfoService)context.getBean("infoService");
    }    

    public static void main(String[] args) {
        infoService.delete("a004");
    }
}

结果(报错,由于除数为0):

Exception in thread "main" java.lang.ArithmeticException: / by zero

查看数据库表,并未删除成功

把事务取消掉,比如删除事务注解

package maya.servicelmpl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import maya.dao.IInfoDao;
import maya.dao.IWorkDao;
import maya.daolmpl.WorkDao;
import maya.service.IInfoService;
@Service
public class InfoService implements IInfoService {
    @Autowired
    private IWorkDao workDao;
    @Autowired
    private IInfoDao infoDao;

    //@Transactional,事务注解注销掉
    @Override
    public void delete(String code) {
        workDao.deleteByInfoCode(code);
        infoDao.delete(code);
    }
}

再次运行查看结果:依然报错

Exception in thread "main" java.lang.ArithmeticException: / by zero

查看数据库,“a004”已被删除

时间: 2024-10-09 20:51:08

Spring 事务入门的相关文章

spring事务源码研读1

转载摘录自:Spring事务源码分析(一)Spring事务入门 有时为了保证一些操作要么都成功,要么都失败,这就需要事务来保证. 传统的jdbc事务如下: @Test public void testAdd(){ Connection con=null; try { con=DriverManager.getConnection(url , username , password ) con.setAutoCommit(false); //操作一 PreparedStatement ps = c

[Spring框架]Spring 事务管理基础入门总结.

前言:在之前的博客中已经说过了数据库的事务, 不过那里面更多的是说明事务的一些锁机制, 今天来说一下Spring管理事务的一些基础知识. 之前的文章: [数据库事务与锁]详解一: 彻底理解数据库事务一, 什么是事务 事务是逻辑上一组操作,这组操作要么全都成功,要么全都失败. 事务的属性: ACID原子性(Atomicity): 事务作为一个整体被执行,包含在其中的对数据的操作要么全部被执行,要么都不执行.一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态.

spring tranaction 事务入门

一.事务四个属性 原子性(atomicity).一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做. 一致性(consistency).事务必须是使数据库从一个一致性状态变到另一个一致性状态.一致性与原子性是密切相关的. 隔离性(isolation).一个事务的执行不能被其他事务干扰.即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰. 持久性(durability).持久性也称永久性(permanence),指一个事务一旦提交,它

spring boot 入门篇

什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.用我的话来理解,就是spring boot其实不是什么新的框架,它默认配置了很多框架的使用方式,就像maven整合了所有的jar包,spring boot整合了所有的框架(不知道这样比喻是否合适). 使用spring boot有什么好处 其实就是简单.快速.方便!平时如果我

Spring快速入门

时间:2017-1-29 02:15 Spring的IOCSpring的AOP,AspectJSpring的事务管理,三大框架的整合 --什么是Spring 1.Spring是分层的JavaSE/EE full-stack(一站式)轻量级开源框架.    1)分层:        *   SUN公司提供的EE的三层结构:Web层.业务层.数据访问层(持久层)        *   Struts2是Web层基于MVC设计模式框架.        *   Hibernate是持久层的一个ORM框架.

Spring AOP入门——概念及注意点

AOP是什么? AOP从功能上来说就是在执行某些业务逻辑的前后,可以允许你动态地添加一些操作(比如记录日志.或者是判断是否有权限等),这些操作的添加,完全不耦合于原来的业务逻辑,从而对原有业务逻辑完全是透明. 也就是说,这段操作和业务逻辑是完全分开的,它可能在项目中需要横切多个模块,且其自身也是一个独立的模块,贯穿了整个项目.我们完全可以根据需要启用或者停用这个功能. AOP的典型应用就是事务管理和日志. AOP中的概念 下面这些术语并不是Spring定义的.由于AOP中的术语不是那么形象,所以

JAVAWEB开发之Spring详解之——Spring的入门以及IOC容器装配Bean(xml和注解的方式)、Spring整合web开发、整合Junit4测试

Spring框架学习路线 Spring的IOC Spring的AOP,AspectJ Spring的事务管理,三大框架的整合 Spring框架概述 什么是Spring? Spring是分层的JavaSE/EE full-stack(一站式)轻量级开源框架. 所谓分层: SUN提供的EE的三层结构:web层.业务层.数据访问层(也称持久层,集成层). Struts2是web层基于MVC设计模式框架. Hibernate是持久的一个ORM的框架. 所谓一站式:Spring框架有对三层的每层解决方案.

构建微服务:Spring boot 入门篇

构建微服务:Spring boot 入门篇 什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.用我的话来理解,就是spring boot其实不是什么新的框架,它默认配置了很多框架的使用方式,就像maven整合了所有的jar包,spring boot整合了所有的框架(不知道这样比喻是否合适). 使用spring boot有什

Spring MVC 入门实例

概述: springmvc 框架围绕DispatcherServlet这个核心展开,DispatcherServlet是Spring MVC的总控制,它负责截获请求并将其分派给相应的处理器处理.SpringMVC框架包括注解驱动控制器.请求及响应的信息处理.视图解析.本地化解析.上传文件解析.异常处理以及表单标签绑定等内容. SpringMVC是主要基于MODEL2实现的技术框架,Model2是经典的MVC(model.view.control)模型在web应用中的变体,这个改变主要源于HTTP