搞定J2EE核心技术与企业应用
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

7.4 JDBC高级应用——事务处理

事务处理由若干个步骤组成,所有步骤必须同时操作成功或者失败。当所有的步骤都操作成功时,事务就算操作成功了;而当其中某一个步骤操作失败时,则该步骤之前的操作就必须撤销。例如,在一个银行交易系统中,假如一个数据库表用来存放客户的存款金额,另一个数据库表用来存放客户的交易历史。客户进行交易操作的过程,就是一个典型的事务。当客户取钱时,一方面要改变客户的存款金额,另一方面要增加客户的交易历史记录,要么都成功,要么都失败,不能改变了客户的存款金额,却没有任何交易记录。

7.4.1 事务处理概述

事务的特性包括原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durabilily)。

● 原子性:表示事务是否完全完成,若因为任何原因导致其中的一个步骤操作失败,则所有步骤都操作失败,前面已经完成的步骤也必须回滚,系统将返回到事务开始前的状态。

● 一致性:表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。

● 隔离性:表示在事务执行过程中对数据的修改,在事务提交之前对其他事务是不可见的。

● 持久性:表示对数据的操作应该是持久性。

7.4.2 如何应用事务处理

要进行事务处理,就离不开事务的设定、开始事务、执行SQL、提交事务及事务失败后的回滚。下面是一个典型的应用事务处理将数据新增到数据库的过程;

      public void insert() throws Exception{
        //取得连接
        Class.forName("org.postgresql.Driver");
      String url ="JDBC:postgresql://localhost/ testDb "
      String user="postgres";
      String password=" postgres ";
      Connection conn= DriverManager.getConnection(url,user,password);
          try {
              //开始进行事务处理
              conn.setAutoCommit(false);
              Statement stmt = con.createStatement();
              String sql = "insert into user (username, password) values('" + username + "', '" + password + "')";
              //执行新增语句
              int counts = stmt.executeUpdate(sql);
              if (counts != 0) {
                  infoOut.put("msg", "新增成功");
              } else {
                  infoOut.put("msg", "新增失败");
              }
              //事务提交
              con.commit();
          } catch (SQLException e) {
              e.printStackTrace();
          }  catch(Exception e){
              //事务回滚
              con.rollback();
              e.printStackTrace();
          } finally {
              //关闭连接
              con.close();
          }
      }