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{
            //关闭数据库连接。。。。
        }
    }
}
原文地址:https://www.cnblogs.com/tongxuping/p/7003139.html