zoukankan      html  css  js  c++  java
  • Java-事务管理

    1、事务的概念:
      事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功。

    2、 管理事务:

      2.1. 数据库默认的事务
        数据库默认支持事务的,但是数据库默认的事务是一条sql语句独占一个事务,这种模式,意义不大。
      2.2. 手动控制事务
        如果希望自己控制事务也是可以的:
        start transaction;
        -- 开启事务,在这条语句之后的所有的sql将处在同一事务中,要么同时完成要么同时不完成
          ......
        --事务中的sql在执行时,并没有真正修改数据库中的数据
        commit;
        -- 提交事务,将整个事务对数据库的影响一起发生
        rollback;
        -- 回滚事务,将这个事务对数据库的影响取消掉

       2.3. JDBC中控制事务
        Connection conn
        PreparedStatement pstat
        ResultSet rs
        当Jdbc程序向数据库获得一个Connection对象时,默认情况下这个Connection对象会自动向数据库提交在它上面发送的SQL语句。若想关闭这种默认提交方式,让多条SQL在一个事务中执行,可使用下列语句:
        conn.setAutoCommit(false);
        --关闭自动提交后,conn将不会帮我们提交事务,在这个连接上执行的所有sql语句将处在同一事务中,需要我们是手动的进行提交或回滚
        conn.commit();
        --提交事务
        conn.rollback();
        --回滚事务
        也可以设置回滚点回滚部分事务。
        Savepoint sp = conn.setSavepoint();
        conn.rollback(sp);
        --注意,回到回滚点后,回滚点之前的代码虽然没被回滚但是也没提交呢,如果想起作用还要做commit操作.

    public class TranDemo {
        public static void main(String[] args) {
            Connection conn = null;
            PreparedStatement pstat = null;
            Savepoint sp =null;
            try{
                //String url = "jdbc:mysql://ip:3306/database";
                String url = "jdbc:mysql:///day20";
                Class.forName("com.mysql.jdbc.Driver");
                conn= DriverManager.getConnection(url, 
                        "root", "root");
                //开启事务
                conn.setAutoCommit(false);
                //a-520
                pstat = conn.prepareStatement("update account set " +
                        "money=money-? where name=?");
                pstat.setDouble(1, 520);
                pstat.setString(2, "a");
                pstat.executeUpdate();
                //b+520
                pstat = conn.prepareStatement("update account set " +
                        "money=money+? where name=?");
                pstat.setDouble(1, 520);
                pstat.setString(2, "b");
                pstat.executeUpdate();
                //设置回滚点
                sp= conn.setSavepoint();
                //b消费了1040
                pstat = conn.prepareStatement("update account set " +
                        "money=money-? where name=?");
                pstat.setDouble(1, 1040);
                pstat.setString(2, "b");
                pstat.executeUpdate();
                //人为抛出一个异常
                int x = 3/0;
                //a+1040
                pstat = conn.prepareStatement("update account set " +
                        "money=money+? where name=?");
                pstat.setDouble(1, 1040);
                pstat.setString(2, "a");
                pstat.executeUpdate();
                //提交事务
                conn.commit();
            }catch (Exception e) {
                if(conn!=null){
                    if(sp!=null){
                        try {
                            //回滚到到sp
                            conn.rollback(sp);
                            //将转账的操作提交
                            conn.commit();
                        } catch (SQLException e1) {
                            e1.printStackTrace();
                        }
                    }else{
                        try {
                            //回滚事务开启的地方
                            conn.rollback();
                        } catch (SQLException e1) {
                            e1.printStackTrace();
                        }
                    }
                }
            }finally{
                //关闭数据库连接。。。。
            }
        }
    }
  • 相关阅读:
    Java实现 LeetCode 467 环绕字符串中唯一的子字符串
    Java实现 LeetCode 467 环绕字符串中唯一的子字符串
    从ramdisk根文件系统启动Linux成功
    linux中的设备名称和设备号
    设备与驱动的关系以及设备号、设备文件
    使用BusyBox制作Linux根文件系统
    使用Busybox-1.2.0制作根文件系统
    使用BusyBox制作根文件系统
    使用busybox制作rootfs
    uboot里读sd卡内容
  • 原文地址:https://www.cnblogs.com/tongxuping/p/7003139.html
Copyright © 2011-2022 走看看