事务管理

**事务处理**
1.编程式事务

//    编程式事务
    @Test
    public void test3(){
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-pool.xml");
        DruidDataSource ds = (DruidDataSource) context.getBean("dataSource");

        Connection con = null;
        Statement stmt = null;
        ResultSet result = null;

        try {
            con = ds.getConnection();
            stmt = con.createStatement();
            //关闭自动提交
            con.setAutoCommit(false);

            String insertSql = "insert into eac_core_biz "
                    + "(id, biz_system_id, biz_system_name, status_code, export, created_by, create_time, "
                    + "updated_by, update_time) values (14, ‘Test2‘, ‘帝景豪庭‘, 2, null, null, ‘2016-12-13 17:29:44‘, "
                    + "null, ‘2016-12-13 17:29:44‘)";
             //插入数据操作
            stmt.executeUpdate(insertSql);

            //模拟异常出现
            Assert.isTrue(false,"事务测试,模拟异常");

             //更新数据操作
            stmt.executeUpdate("update eac_core_biz set biz_system_id=‘efc‘ where id=14");
            //事务提交
            con.commit();
        } catch (Exception e) {
             //事务回滚
            try {
                con.rollback();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }finally{
            closeResultSet(result);
            closeStatement(stmt);
            closeConnection(con);
        }
    }

2.注解式事务

<!-- 定义数据源 -->
    <bean id="dataSource"
      class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/yun?characterEncoding=UTF8" />
        <property name="username" value="root" />
        <property name="password" value="centos" />
    </bean> 

     <!-- 定义JdbcTemplate的Bean -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"
            p:dataSource-ref="dataSource">
    </bean>  

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

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

    <bean id="userDao" class="com.guo.dao.impl.UserDaoImpl">
        <property name="jdbcTemplate" ref="jdbcTemplate"></property>
    </bean>

接口 IUserDao

package com.guo.dao;

import com.guo.entity.User;

public interface IUserDao {
    void insertUser(User user);
}

实现 UserDaoImpl

package com.guo.dao.impl;

import java.sql.Types;

import org.apache.log4j.Logger;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.transaction.annotation.Transactional;

import com.guo.dao.IUserDao;
import com.guo.entity.User;

@Transactional
public class UserDaoImpl implements IUserDao {

    Logger LOGGER = Logger.getLogger(getClass());

    private JdbcTemplate jdbcTemplate;

    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public void insertUser(User user) {

        String insertSql = "insert into student (ID, NAME, AGE) values (?,?,?)";
        Object[] params = new Object[] { user.getId(),user.getName(),user.getAge() };
        int[] types = new int[] { Types.INTEGER, Types.VARCHAR,Types.INTEGER };
        int number = jdbcTemplate.update(insertSql, params, types);
        LOGGER.info("执行语句{insert into student (ID, NAME, AGE) values (?,?,?)},生效"+number+"条。");

        //模拟异常出现
//        Assert.isTrue(false,"事务测试,模拟异常");
    }

}

@Transactional 注解可用于实现类上,也可以放在具体的方法上。

3.spring aop 拦截器事务

时间: 2024-12-08 07:31:27

事务管理的相关文章

Spring事务管理(详解+实例)

写这篇博客之前我首先读了<Spring in action>,之后在网上看了一些关于Spring事务管理的文章,感觉都没有讲全,这里就将书上的和网上关于事务的知识总结一下,参考的文章如下: Spring事务机制详解 Spring事务配置的五种方式 Spring中的事务管理实例详解 1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是要么都执行要么都

10.Spring事务管理【TX】

转账案例环境搭建 1.引入JAR包 IOC的6个包 AOP的4个包 C3P0的1个包 MySQL的1个驱动包 JDBC的2个目标包 整合JUnit测试1个包 2.引入配置文件 log4j.properties+applicationContext.xml ### direct log messages to stdout ### log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=

注解方式实现声明式事务管理

使用注解实现Spring的声明式事务管理,更加简单! 步骤: 1) 必须引入Aop相关的jar文件 2) bean.xml中指定注解方式实现声明式事务管理以及应用的事务管理器类 3)在需要添加事务控制的地方,写上: @Transactional @Transactional注解: 1)应用事务的注解 2)定义到方法上: 当前方法应用spring的声明式事务 3)定义到类上:   当前类的所有的方法都应用Spring声明式事务管理; 4)定义到父类上: 当执行父类的方法时候应用事务. 修改bean

Spring整合hibernate4:事务管理

Spring和Hibernate整合后,通过Hibernate API进行数据库操作时发现每次都要opensession,close,beginTransaction,commit,这些都是重复的工作,我们可以把事务管理部分交给spring框架完成. 配置事务(xml方式) 使用spring管理事务后在dao中不再需要调用beginTransaction和commit,也不需要调用session.close(),使用API  sessionFactory.getCurrentSession()来

SSM框架中使用Spring的@Transactional注解进行事务管理

一 介绍 在企业级应用中,保护数据的完整性是非常重要的一件事.因此不管应用的性能是多么的高.界面是多么的好看,如果在转账的过程中出现了意外导致用户的账号金额发生错误,那么这样的应用程序也是不可接受的 数据库的事务管理可以有效地保护数据的完整性(PS:关于数据库的事务管理基础可以参考我以前写过的这篇文章:http://www.zifangsky.cn/385.html),但是原生态的事务操作需要写不少的代码,无疑是非常麻烦的.在使用了Spring框架的应用中,我们可以使用@Transactiona

JDBC事务管理及SavePoint示例

JDBC API提供了setAutoCommit()方法,通过它我们可以禁用自动提交数据库连接.自动提交应该被禁用,因为只有这样事务才不会自动提交,除非调用了连接的commit()方法.数据库服务器使用表锁来实现事务管理,并且它是一种紧张的资源.因此,在操作完成后应该尽快提交事务.让我们编写另外一个程序,这里我将使用JDBC事务管理特性来保证数据的完整性不被破坏. .......... try { con = DBConnection.getConnection(); // set auto c

Spring事务管理

写这篇博客之前我首先读了<spring in action>,之后在网上看了一些关于Spring事务管理的文章,感觉都没有讲全,这里就将书上的和网上关于事务的知识总结一下,参考的文章如下: Spring事务机制详解 Spring事务配置的五种方式 Spring中的事务管理实例详解 1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是要么都执行要么都

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

前几篇的文章都只是初步学习spring和mybatis框架,所写的实例也都非常简单,所进行的数据访问控制也都很简单,没有加入事务管理.这篇文章将初步接触事务管理. 1.事务管理 理解事务管理之前,先通过一个例子讲一下什么是事务管理:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是要么都执行要么都不执行.如果银行卡扣除了1000块但是ATM出钱失败的话,你将会损失1000元:如果银行卡扣钱失败但是ATM却出

JDBC应用中的事务管理

在开发中,对数据库的多个表或者对一个表中的多条数据执行更新操作时要保证对多个更新操作要么同时成功,要么都不成功,这就涉及到对多个更新操作的事务管理问题了.比如银行业务中的转账问题,A用户向B用户转账100元,假设A用户和B用户的钱都存储在Account表,那么A用户向B用户转账时就涉及到同时更新Account表中的A用户的钱和B用户的钱,用SQL来表示就是: update account set money=money-100 where name='A'; update account set