zoukankan      html  css  js  c++  java
  • <十一>JDBC_事务的处理+隔离


    Tom给jerry汇款500元

    1、如果多个操作,每个操作使用的是自己的单独的连接,则无法保证事务

    2、具体步骤:
       1>事务开始操作前,开始事务:取消Connection的默认提交行为

       2>如果事务的操作都成功,都提交事务
       3>回滚事务:若出现异常,则在catch块中回滚事务;

    3、模板 try {
      
       //开始事务:取消默认提交(默认自动提交) con.setAutoCommit(false);
      
       //...
      
       
      //提交事务 con.commit();
      
      } catch (Exception e) {
      
      //...
      
     //如果出现异常就回滚事

           try {

                con.rollback();

          } catch (SQLException e1) {
                e1.printStackTrace();

          }

     }

    @Test
     public void testTransaction() {
      
        Connection con = null;
        try {

           con = JDBCTools.getConnection();
           System.out.println("默认事务:" + con.getAutoCommit());
           // 开始事务:取消默认提交(默认自动提交)
           con.setAutoCommit(false);
           String sql = "update users set balance=balance-500 where id=1";
           update(con, sql);
           int i = 10 / 0;
           sql = "update users set balance=balance+500 where id=2";
           update(con, sql);
           // 提交事务
           con.commit();

        } catch (Exception e) {
           // 如果出现异常就回滚事务
           try {
              con.rollback();
           } catch (SQLException e1) {
              e1.printStackTrace();
           }
        } finally {
           JDBCTools.release(null, null, con);
        }

     }

     设置事务的隔离级别

     @Test
     public void testTransactionIsolationRead() {
      
      String sql = "select balance from users where id=1";
      Integer balance=getForValue(sql);
      System.out.println("balance="+balance);
     }

     
     
     /*
      * 测试事务的隔离级别 在JDBC程序中可以通过Connection的setTransactionIsolation()方法 来设置事务的隔离级别
      */
     @Test
     public void testTransactionIsolationUpdate() {

      Connection con = null;

      try {

       con = JDBCTools.getConnection();
       // 开始事务:取消默认提交(默认自动提交)
       con.setAutoCommit(false);
       String sql = "update users set balance=balance-500 where id=1";
       update(con,sql);
       con.commit();

      } catch (Exception e) {
       e.printStackTrace();
      } finally {

      }
     }

     // 返回某个对象的属性值
     @SuppressWarnings("unchecked")
     public <E> E getForValue(String sql, Object... args) {

      // 1、得到结果集:该结果集应该只有一行且只有一列
      Connection con = null;
      PreparedStatement ps = null;
      ResultSet rs = null;
      try {

       con = JDBCTools.getConnection();
       //con.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
       con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
       ps = con.prepareStatement(sql);
       for (int i = 0; i < args.length; i++) {
        ps.setObject(i + 1, args[i]);
       }
       rs = ps.executeQuery();

       if (rs.next()) {
        return (E) rs.getObject(1);
       }

      } catch (Exception e) {
       e.printStackTrace();
      } finally {
       JDBCTools.release(rs, ps, con);
      }

      // 2、取得结果集的
      return null;
     }

    更新后的JDBCTools.java工具类如下:

    import java.io.InputStream;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Properties;

    /*
     * JDBC工具类
     * */
    public class JDBCTools {

       // 提交事务
       public static void commit(Connection con) {

          if (con != null) {
             try {
                con.commit();
             } catch (SQLException e) {
                e.printStackTrace();
             }
          }
       }

       //回滚事务
       public static void rollback(Connection con) {

          if (con != null) {
             try {
                con.rollback();
               } catch (SQLException e) {
                  e.printStackTrace();
               }
            }
       }
     
       //开始事务
       public static void beginTx(Connection con) {

          if (con != null) {
             try {
                con.setAutoCommit(false);
             } catch (SQLException e) {
                e.printStackTrace();
             }
          }
       }

       /*
        * 执行SQL的方法 insert,update,delete
        */
       public static void update(String sql, Object... args) {

          Connection conn = null;
          PreparedStatement ps = null;

          try {
             /*
              * 1、获取Connection连接 2、获取Statement 3、SQL语句 4、关闭数据库连接
              *
              */
             conn = getConnection();
             ps = conn.prepareStatement(sql);

             for (int i = 0; i < args.length; i++) {
                ps.setObject(i + 1, args[i]);
             }

             ps.executeUpdate();

          } catch (Exception e) {
             e.printStackTrace();
          } finally {
             release(null, ps, conn);
          }
       }

       public static Connection getConnection() throws Exception {

          String driverClass = null;
          String jdbcUrl = null;
          String user = null;
          String password = null;

          // 读取类路径下的jdbc.properties文件
          InputStream in = JDBCTools.class.getClassLoader().getResourceAsStream("jdbc.properties");
          Properties properties = new Properties();
          properties.load(in);

          driverClass = properties.getProperty("driver");
          jdbcUrl = properties.getProperty("jdbcUrl");
          user = properties.getProperty("user");
          password = properties.getProperty("password");
          // 加载数据库驱动程序
          Class.forName(driverClass);
          // 通过DriverManager的getConnection()方法获取数据库连接
          Connection connection = DriverManager.getConnection(jdbcUrl, user, password);
          return connection;

       }

       public static void release(ResultSet rs, Statement st, Connection conn) {

          if (rs != null) {
             try {
                rs.close();
             } catch (SQLException e) {
                e.printStackTrace();
             }
          }

          if (st != null) {
             try {
                st.close();
             } catch (SQLException e) {
                e.printStackTrace();
             }
          }

          if (conn != null) {
             try {
                conn.close();
             } catch (SQLException e) {
                e.printStackTrace();
             }
          }
       }
    }

  • 相关阅读:
    PAT A1094 The Largest Generation (25 分)——树的bfs遍历
    PAT A1055 The World's Richest (25 分)——排序
    PAT A1052 Linked List Sorting (25 分)——链表,排序
    PAT A1076 Forwards on Weibo (30 分)——图的bfs
    辅导员
    辅导员面试
    C程序设计
    Excel VBA 基本概念
    Excel函数
    导入excel表的数据到数据库ssh
  • 原文地址:https://www.cnblogs.com/iamkk/p/6091558.html
Copyright © 2011-2022 走看看