【问题标题】:Why we are using transactions in JDBC?为什么我们在 JDBC 中使用事务?
【发布时间】:2013-10-21 09:00:02
【问题描述】:

下面提到了带有和不带有事务的我的 jdbc 程序代码。

没有 JDBC 中的事务

stmt = conn.createStatement();

      System.out.println("creating statement....");
      String sql;
      sql = " INSERT INTO testing VALUES (3,  'Rita', 'Tez','vizag')";
      stmt.executeUpdate(sql);
      System.out.println("deleted.....");
      sql = "SELECT s_no,s_name,s_group,s_area  from testing group by s_no,s_name,s_group, s_area";
      ResultSet rs = stmt.executeQuery(sql);
      while(rs.next()){


         String s_name = rs.getString("s_name");


         System.out.println("employees names:" +s_name);
      }

在 JDBC 中使用事务

conn.setAutoCommit(false);



      System.out.println("Creating statement...");
      stmt = conn.createStatement(
                           ResultSet.TYPE_SCROLL_INSENSITIVE,
                           ResultSet.CONCUR_UPDATABLE);


      System.out.println("Inserting one row....");
      String SQL = "INSERT INTO testing " +
                    "VALUES (3,  'Rita', 'Tez','vizag')";
      stmt.executeUpdate(SQL);  


      SQL = "INSERT INTO testing " +
                    "VALUES (4,  'Sita', 'Singh','hyd')";
      stmt.executeUpdate(SQL);


      System.out.println("Commiting data here....");
      conn.commit();


      String sql = "SELECT  s_no,s_name,s_group,s_area FROM testing group by s_no,s_name,s_group,s_area ";
      ResultSet rs = stmt.executeQuery(sql);
      System.out.println("List result set for reference....");
      printRs(rs);


      rs.close();
      stmt.close();
      conn.close();
   }catch(SQLException se){

      se.printStackTrace();

      System.out.println("Rolling back data here....");
      try{
         if(conn!=null)
            conn.rollback();
      }catch(SQLException se2){
         se2.printStackTrace();
      }

   }catch(Exception e){

      e.printStackTrace();
   }finally{

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

}

   public static void printRs(ResultSet rs) throws SQLException{

      rs.beforeFirst();
      while(rs.next()){

         int s_no = rs.getInt("s_no");
         String s_name = rs.getString("s_name");
         String s_group = rs.getString("s_group");
         String s_area = rs.getString("s_area");


         System.out.print("s_no: " + s_no);
         System.out.print(", s_name: " + s_name);
         System.out.print(", s_group: " + s_group);
         System.out.println(", s_area: " + s_area);
     }
     System.out.println();
   }
}

两个交易都返回相同的结果,然后我们在JDBC 中使用TRANSACTIONS。请澄清我的疑问。

【问题讨论】:

  • 与您在数据库的任何其他用途中使用事务的原因相同。将一组语句作为一个单元提交或回滚。

标签: java sql jdbc transactions


【解决方案1】:

在第二个示例中使用了事务,因为作为事务的一部分正在执行多个插入。如果第二次插入失败,事务能够回滚第一次插入。它使这两个操作成为一个原子单元。

【讨论】:

  • 你的意思是在JDBC中使用事务比较好,不是吗?
  • 还有其他方法可以用非常简单的方式编写 TRANSACTION'S。请建议我,我认为我的交易流程代码非常大,您可以简化我的代码吗?
【解决方案2】:

JDBC Connection 处于自动提交模式,默认为自动提交模式, 然后每个 SQL 语句在其完成后提交到数据库。 出于以下原因,我们希望关闭自动提交并管理您自己的事务:

  • 提高性能
  • 维护业务流程的完整性

事务使我们能够控制是否对数据库应用了任何更改。它将单个 SQL 语句或一组 SQL 语句视为一个逻辑单元。如果任何一条语句失败,则整个事务都会失败。

要启用手动事务而不是 JDBC 驱动程序的自动提交模式,请使用 Connection 对象的 setAutoCommit() 方法。一旦我们完成更改并想要提交更改,然后调用 commit() 方法。否则,要回滚使用名为 conn 的连接对数据库进行的更新,请使用

 conn.rollback( );

参考transaction

【讨论】:

  • 维基百科解释得很好
  • 还有其他方法可以用非常简单的方式编写 TRANSACTION'S。请建议我,我认为我的交易流程代码非常大,您可以简化我的代码吗?
【解决方案3】:

事务不仅仅是提交/回滚。它只是 ACID Click.. 中的一个属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    • 2011-02-05
    • 2014-06-20
    • 2017-05-03
    • 2013-10-20
    相关资源
    最近更新 更多