前两天给公司的数据库操作加了事务管理,今天博客就更一下这个吧。

先说明:本文只是简单得实现一下事务,事务的具体内容,比如事务的等级,事务的具体实现原理等等。。。 菜鸟水平有限,暂时还更不了这个,以后的博客可能会涉及。

如果您看完本博客之后能简单的实现一个事务,本文目的就达到了。

首先简单通俗的解释一下啥叫事务: 在一个方法里的所有操作数据库的语句,要么全部执行(方法没有报错),要么全部不执行(方法抛错,已经执行的语句回滚)。

xml形式实现事务,也是我在公司代码中实现的事务。他的好处是不用对现有代码进行任何修改,比较适合这种后期新加入的事务管理,缺点是可能会造成xml文件的庞大。

下面是xml中各个信息:

<context:property-placeholder location="classpath:jdbc.properties" />

该语句用于读取配置文件(数据库的用户名密码等)

<aop:config proxy-target-class="true"></aop:config>

强制使用CGLIB代理(暂时不知道为啥,不加这句我的代码会报错)

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="defaultAutoCommit" value="true" />
        <property name="driverClassName" value="${driverClassName}" />
        <property name="url" value="${url}" />
        <property name="username" value="umetrip" />
        <property name="password" value="${password}" />
    </bean>

数据源,不解释!

<bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

注册事务,并指定事务处理的数据源

<!-- 注册数据库操作类 -->
<bean id="testDao" class="testSpring.business.Dao.iface.impl.TestDaoImpl">
        <property name="dataSource" ref="dataSource" />
    </bean>

    <bean id="dbTest1" class="testSpring.business.transaction.DbTest1">
        <property name="testDao" ref="testDao" />
    </bean>
<aop:config>
        <aop:pointcut id="transactionPointcut"
            expression="execution(* testSpring.business.Dao.iface.impl..*.*(..))" />
        <aop:advisor advice-ref="txAdvice" pointcut-ref="transactionPointcut" />
    </aop:config>

注册事务的切入点。可以看到,事务是利用spring中的面向切面,向方法中注入事务管理。

其中expression="execution(* testSpring.business.Dao.iface.impl..*.*(..))  :

1、execution(): 表达式主体。

2、第一个*号:表示返回类型,*号表示所有的类型。

3、包名:表示需要拦截的包名,后面的两个句点表示当前包和当前包的所有子包,com.sample.service.impl包、子孙包下所有类的方法。

4、第二个*号:表示类名,*号表示所有的类。

5、*(..):最后这个星号表示方法名,*号表示所有的方法,后面括弧里面表示方法的参数,两个句点表示任何参数。

<tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <!-- 如果方法是以get开头的方法,则不使用事务 -->
            <tx:method name="get*" read-only="true" propagation="NOT_SUPPORTED" />
            <!-- 类中所有其他方法都使用事务管理 -->
            <tx:method name="*" />
        </tx:attributes>
    </tx:advice>

为事务指定管理者并配置事务信息。

只需要配置xml文件即可,代码不用做任何修改。

测试代码:

//读取配置文件(将配置文件中的bean加载进内存)
        ApplicationContext ctx = new ClassPathXmlApplicationContext("/testSpring/resources/applicationContext_transaction.xml");
        //获取的实例
        DbTest1 bean = (DbTest1)ctx.getBean("dbTest1");
        //调用方法
        try{
            bean.test();
        }catch(Exception e){
            e.printStackTrace();
        }

TestDaoImpl类:

package testSpring.business.Dao.iface.impl;

import javax.sql.DataSource;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import testSpring.business.Dao.iface.ITestDao;
import testSpring.business.bean.TableBean;

/**
 *  ITestDao.java :
 * @author xuejupo  jpxue@travelsky.com
 * create in 2016-2-16 下午5:04:56
 */
public class TestDaoImpl implements ITestDao{

    private JdbcTemplate jdbcTemplate;

    public void setDataSource(DataSource dataSource){
        this.jdbcTemplate=new JdbcTemplate(dataSource);
    }

    @Override
    public void add(TableBean user) {
        // TODO Auto-generated method stub
        jdbcTemplate.update("insert into test values(?,?)", new Object[]{user.getId(),user.getName()});
        this.del(1);
        jdbcTemplate.update("delete from test where id = ?",new Object[]{213123,2});
    }
        @Override
    public void del(int id) {
        // TODO Auto-generated method stub
        jdbcTemplate.update("delete from test where id = ?",new Object[]{id});
    }
}

多次修改TestDaoImpl类的add代码并执行结果发现:add方法如果抛出异常,那么add方法内所有的sql语句都会回滚。但是如果add方法内没有发生异常或者异常被处理,那么add方法已经执行的sql语句就会被提交。

小结:

1.事务是针对某一个方法的,只要是在这个方法内抛错,这个方法内的所有数据库操作全部回滚(比如上面类中add方法里的del方法也会回滚)。

2.如果在进行事务管理的方法里将异常catch住并且写入log,而没有向外抛出,那么当前方法事务无效。。。解决方法是可以在写入log后向外抛出一个异常。

3.事务是很复杂的。。 不要看上面写的很简单。 比如事务的隔离等级,事务的锁表等级(行锁还是表锁,还有是否锁住索引等)。

PS:如果您看到的不是我的博客园的博客(爬虫的僵尸博客),欢迎到我的博客跟我一起讨论:http://www.cnblogs.com/xuejupo/

spring实现一个简单的事务管理的更多相关文章

  1. Spring 多数据源 @Transactional 注解事务管理

    在 Spring,MyBatis 下两个数据源,通过 @Transactional 注解 配置简单的事务管理 spring-mybatis.xml <!--******************* ...

  2. 事务隔离级别与传播机制,spring+mybatis+atomikos实现分布式事务管理

    1.事务的定义:事务是指多个操作单元组成的合集,多个单元操作是整体不可分割的,要么都操作不成功,要么都成功.其必须遵循四个原则(ACID). 原子性(Atomicity):即事务是不可分割的最小工作单 ...

  3. Spring事务隔离级别与传播机制详解,spring+mybatis+atomikos实现分布式事务管理

    原创说明:本文为本人原创作品,绝非他处转载,转账请注明出处 1.事务的定义:事务是指多个操作单元组成的合集,多个单元操作是整体不可分割的,要么都操作不成功,要么都成功.其必须遵循四个原则(ACID). ...

  4. spring boot配置mybatis和事务管理

    spring boot配置mybatis和事务管理 一.spring boot与mybatis的配置 1.首先,spring boot 配置mybatis需要的全部依赖如下: <!-- Spri ...

  5. [Winform]一个简单的账户管理工具

    最近一直觉得注册的账户越来越多,帐号密码神马的容易弄混.自己就折腾了一个简单的账户管理工具,其实实现也挺简单,将每个账户的密码及相关密码提示信息,经aes算法加密之后保存到数据库,当前登录用户可以查询 ...

  6. Asp.NetMVC利用LigerUI搭建一个简单的后台管理详解(函登录验证)

    上一篇 Asp.Net 中Grid详解两种方法使用LigerUI加载数据库数据填充数据分页  了解了LigerUI 中Grid的基本用法  现在结合上一篇的内容做一个简单的后台管理,当然也有前台的页面 ...

  7. Spring+Mybatis+MySql+Maven 简单的事务管理案例

    利用Maven来管理项目中的JAR包,同时使用Spring在业务处理层进行事务管理.数据库使用MySq,数据处理层使用Spring和Mybatis结合. 本案例代码主要结构如图: 1.数据库脚本 -- ...

  8. spring boot一个简单用户管理DEMO

    概述 该Demo旨在部署一个简单spring boot工程,包含数据编辑和查看功能 POM配置 <?xml version="1.0" encoding="UTF- ...

  9. spring+mybatis之声明式事务管理初识(小实例)

    前几篇的文章都只是初步学习spring和mybatis框架,所写的实例也都非常简单,所进行的数据访问控制也都很简单,没有加入事务管理.这篇文章将初步接触事务管理. 1.事务管理 理解事务管理之前,先通 ...

随机推荐

  1. phpstorm 实现SFTP开发,线上线下同步(实时更新代码)

    https://blog.csdn.net/zz_lkw/article/details/79711746

  2. NSIS 查找目录下的所有文件夹

    在制作安装包的时候,需要查看下某一目录下的所有文件夹的名称.经过查资料发现需要用到NSIS 的一个插件Locate.下载该插件后,会在NSIS的安装目录 ...Program Files\NSIS\P ...

  3. Android转换集合数据(ArrayList)为Json格式并上传服务器

    使用Gson上传集合数据到服务器,1.最外层用 ArrayMap<String, Object> 封装:2.通过  mRequestParam.put("cmdLineIds&q ...

  4. 左手是“Python”的身体,右手是“R”的灵魂,你爱哪个?

    来源商业新知网,原标题:你爱 “Python”的身体,还是“R”的灵魂? 数据科学界有三大宝: Python.SAS和R,不过像SAS这种高端物种,不是我们这些平民能供养得起的啊. 根据 IEEE S ...

  5. windows集群简单介绍

    windows集群简单介绍仔细看过以前网友发表的一些文章,总觉得对windows集群没有详细介绍,我也是借花献佛,引用了一些技术性文档.目前应用最为广泛的集群计算技术可以分为三大类:高可用性集群技术. ...

  6. python经典案例

    前言:初学者对python的流程语句有一定的了解,但是运用起来总会磕磕碰碰.本文总结了一些初学者在学习python时做的经典案例 一.名片管理系统(限单个名片) info = {'name':'jam ...

  7. Excel基本操作

    一.excel公式下拉 1.选择最长一列excel ,按CTRL+↓移到最后一个单元格,2光标移到下拉公式的那一列,3.再按CTRL+SHIFT+↑,4.再按CTRL+D 二.输入身份证号等长数字 方 ...

  8. springboot+dubbo+mybatis多模块项目invalid boundexception

    invalid boundexception的原因大抵是因为mybatis扫描不到mapper映射文件(xml),无法将mapper接口类(java)中的接口与mapper映射器绑定起来.这可能是因为 ...

  9. Vue如何更新子组件

    黑科技: 给子组件绑定一个key值,当key值改变时,子组件就会更新 ~

  10. MTD的认识

    MTD即内存计数设备,是linux中对ROM.NORFLASH.NAND  Flash等存储设备抽象出来的一个设备层,它向上提供统一的访问接口:读写.擦除等:屏蔽了底层硬件的操作.各类存储设备的差别. ...