Spring事务处理

主要是两个方面:

  一是开始事务

 conn.setAutoCommit(false);默认是true

  二是提交事务

  conn.commit();

一、创建一个类

  连接数据库的方法封装在Util包中,获取Connection连接。该类的功能是通过id修改表t_emp 中对应id的acount的值。

  使用Connection的preparestatement方法。

public class AcountDao {
    public void update(Connection conn,Integer id,Integer count) {
        String sql="update t_emp set acount=acount+? where id=?";
        PreparedStatement ps=null;
        try {
            ps = conn.prepareStatement(sql);
            ps.setInt(1, count);
            ps.setInt(2, id);
            ps.executeUpdate();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

二、创建一个测试类JUnit Test Case

private AcountDao acountdao=new AcountDao();
    @Test
    public void testUpdate() {
        Connection conn=null;//一个connection对象
        conn=Util.getConn();
        try {
//            开启事务,需要手动提交
            conn.setAutoCommit(false);//      孙悟空向猪八戒转账100元
            acountdao.update(conn,1, -100);//一个connection对象
            int aa=10/0;//      猪八戒收到孙悟空的转账的100元
            acountdao.update(conn,2, 100);//一个connection对象
//            提交事务
            conn.commit();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally {
            try {
                conn.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

这里需要注意:我们前后

 acountdao.update();方法中都有Connection,加上程序刚开始创建的Connection对象,总共是有3个Connection对象。我们要保持着3个Connection对象是同一个Connection对象。

当孙悟空转账后出现了错误,提交的事务的方法就可以回滚,即将执行的操作向回翻滚,回滚到开始事务的时刻,就相当于从来没有执行过。

  

时间: 2024-10-12 16:04:58

Spring事务处理的相关文章

spring事务处理详解

1:Java包含两种异常:checked异常和unchecked异常. checked和unchecked异常之间的区别是: Checked异常必须被显式地捕获try-catch-finally,而unchecked异常则可以不必捕获或抛出. Checked异常继承java.lang.Exception类.Unchecked异常继承自java.lang.RuntimeException类. 2:Mysql 存储引擎中InnoDB与Myisam的主要区别 事务处理方面:innodb 支持事务功能,

Spring事务处理流程和原理

一.事务理论学习 利用数据库事务实现应用事务控制 1.要求:同一个事务需要同一个库的同一个连接. 2.  3.分布式事务 JTA  二.spring事务处理建模 1. 2. 三.spring事务处理流程 1. 2. 3. 原文地址:https://www.cnblogs.com/wenxiangchen/p/11444098.html

Spring - 事务处理

关于事务处理 事务为了保证数据的一致性和完整性,保证整个操作的原子性. 编程式事务 需要在代码中直接加入事务的逻辑,可能需要在代码中显式的调用beginTransaction().commit().roolback()等事务管理相关的方法. 需要在方法开始的时候开启事务,处理完后,在方法结束的时候,关闭事务. 编程式事务侵入性较强,但处理粒度更细. 声明式事务 在方法的外围添加注解或者直接在配置文件中定义.当方法需要处理事务,在Spring中会通过配置文件在方法的前后拦截,并添加事务. Spri

Springmvc + mybatis + spring 配置 spring事务处理

今天配置了半天,发现,事物不起效果,主要出现如下错误: org.mybatis.spring.transaction.SpringManagedTransaction] - [JDBC Connection [[email protected]] will not be managed by Spring SqlSession [[email protected]] was not registered for synchronization because synchronization is

(转)Spring事务处理时自我调用的解决方案及一些实现方式的风险

转:http://www.iteye.com/topic/1122740 预备知识 测试代码准备 问题 解决方案 1通过ThreadLocal暴露Aop代理对象 2通过初始化方法在目标对象中注入代理对象 3通过BeanPostProcessor 在目标对象中注入代理对象 4改进版的InjectBeanSelfProcessor的解决方案 总结 前些日子一朋友在需要在目标对象中进行自我调用,且需要实施相应的事务定义,且网上的一种通过BeanPostProcessor的解决方案是存在问题的.因此专门

Spring源码阅读:Spring声明式事务处理和编程式事务处理的设计与实现

之前的学习,了解了Spring事务管理的基础框架(查看).Spring在此基础上又提到了声明式事务管理和编程式事务管理.这里就来看看Spring是如何实现的. Spring声明式事务与EJB事务管理对比 Spring的声明式管理,类似于EJB的CMT,但又有不同.他们的不同之处有: 1)EJB的CMT是与JTA结合使用,而Spring框架的声明式事务管理可以在任何环境下工作.既可以使用全局事务管理,如JTA,也可以使用局部事务管理如JDBCJPA.Hibernate.JDO等. 2)可以在任何类

spring(15)------spring的事务处理

一,了解事务处理 1.1 基本概念 事务处理在运用程序中起着至关重要的作用,事务处理由若干个步骤组成,这些步骤间有着各种各样的逻辑关系, 一个事务中的所有步骤必须同时成功或失败.当所有步骤操作成功时,事务算完成,而当某个事务操作失败, 所有的步骤都需要回滚.对于提交和回滚的概念说明: 提交(commit):当所有的步骤被完整执行完成时,称该事务被提交. 回滚(rollback):当某个步骤操作异常时,所有的步骤都不能被提交,必须进行回滚,回滚到执行前的状态. 1.2事务处理的特征 原子性(Ato

事务处理: databse jdbc mybatis spring

事务的认识需要一个相当漫长的流程,慢慢在实践中理解,然后在强化相关理论基础. 数据库中的事务: 传统的本地事务处理都是依靠数据库自身事务处理能力,而事务本身是传统关系型数据库的基石.简单来说事务就是一些满足acid特性的sql,数据库通过锁和日志实现这些机制.国内的mysql中innodb事务引擎引料众多,也有很多文章让我们深刻理解索引和事务的概念.此处简单说一下我的理解: A:代表原子性,最好理解,要么全做,要么全不做. C:一致性,简单来说就是你扣了50,有人就加了50(一致性本身存在好多种

Spring事务异常回滚,捕获异常不抛出就不会回滚(转载) 解决了我一年前的问题

最近遇到了事务不回滚的情况,我还考虑说JPA的事务有bug? 我想多了.......    为了打印清楚日志,很多方法我都加tyr catch,在catch中打印日志.但是这边情况来了,当这个方法异常时候 日志是打印了,但是加的事务却没有回滚. 例:     类似这样的方法不会回滚 (一个方法出错,另一个方法不会回滚) : if(userSave){ try { userDao.save(user); userCapabilityQuotaDao.save(capabilityQuota); }