zoukankan      html  css  js  c++  java
  • 事务

    1.事务
    * 使用事务:保证一组操作(一个conn中的多条sql语句),要么全部执行成功,要么全部执行失败
    * 数据库是有事务概念,执行sql语句,就会开启事务,执行成功会提交事务,执行失败会回滚事务
    * mysql数据库:事务是自动的,自动的开启,自动的提交,自动的回滚;不管是提交还是回滚数据永久保存到数据库
    * oracle数据库:事务手动的,手动的开启,手动的提交,手动的回滚;不管是提交还是回滚数据永久保存到数据库
    * 使用Connection接口中的方法就可以把事务设置为手动的
    * void setAutoCommit(boolean autoCommit) 将此连接的自动提交模式设置为给定状态。 (开启事务)
    * autoCommit - 为 true 表示启用自动提交模式;事务是自动,我们控制不了
    * 为 false 表示禁用自动提交模式;事务是手动,我们就可以控制什么时候开启,提交,回滚
    * void commit() 一组sql全部执行成功,提交事务
    * void rollback() 一组sql,有一条执行失败,就回滚事务;会把数据回滚到事务开启之前
    2.转账案例
    * 使用QueryRunner完成转账案例
    * tom账户减去1000元
    * update account set money=money-1000 where name='tom';
    * jerry账户增加1000元
    * update account set money=money+1000 where name='jerry';

    * 注意:
    * QueryRunner的构造方法:
    * QueryRunner(); 空参
    * update(conn),query(conn)
    * 可以使用连接池的工具类获取conn,开启事务
    * QueryRunner(DateSource ds); 带连接池
    * update(),query()
    * 带连接池的构造方法,QueryRunner会自动的从连接池中获取数据库连接conn
    * 使用完毕自动把conn归还给连接池,和我们没有关系,我们看不到conn,也就控制不了事务
    所以,一般我们都是用QueryRunner的空参构造方法

    package cn.itcast.demo02.transferAccount;
    
    import java.sql.Connection;
    import java.sql.SQLException;
    
    import org.apache.commons.dbutils.DbUtils;
    import org.apache.commons.dbutils.QueryRunner;
    
    import cn.itcast.demo01.Utils.C3P0UtilsXML;
    public class Demo02QueryRunner {
    public static void main(String[] args) {
    //1.创建QueryRunner对象
    QueryRunner qr = new QueryRunner();
    //2.使用连接池的工具类获取conn
    Connection conn = null;
    try {
    conn = C3P0UtilsXML.getConnection();
    
    //开启事务
    conn.setAutoCommit(false);
    
    //3.使用QueryRunner中的方法update执行增删改的sql语句
    int row1 = qr.update(conn,"update account set money=money-1000 where name='tom'");
    System.out.println(0/0);
    int row2 = qr.update(conn,"update account set money=money+1000 where name='jerry'");
    //4.处理结果
    if(row1>0 && row2>0){
    System.out.println("转账成功!");
    
    //提交事务
    conn.commit();
    }
    } catch (Exception e) {
    System.out.println(e);
    System.out.println("转账失败!");
    
    //回滚事务
    try {
    conn.rollback();
    } catch (SQLException e1) {
    e1.printStackTrace();
    }
    }finally {
    //C3P0UtilsXML.close(null, null, conn);
    DbUtils.closeQuietly(conn);//归还给连接池
    }
    }
    }
    人生就像一场路途,尝遍酸甜苦辣,方知人生苦甜.
  • 相关阅读:
    BoundsChecker下载
    大型系统内部资源定位的途径
    架构的焦点
    为什么日志只应该有三个级别
    回收站引发ORACLE查询表空间使用缓慢
    题目记录
    广搜入门 待改进的广搜
    归并排序的使用
    大数数组中滚动数组的应用
    多重背包问题
  • 原文地址:https://www.cnblogs.com/zennon/p/8370779.html
Copyright © 2011-2022 走看看