zoukankan      html  css  js  c++  java
  • JSP---网上商城->手动提交事务,保证数据一致性

     1 public int add(SalesOrder so) {
     2         int orderId = -1;
     3         DB db = new DB();
     4         Connection connection = db.getConn();
     5         boolean autoCommit = true;
     6         try {
     7             autoCommit = connection.getAutoCommit();//将默认的提交方式先记下来,以恢复现场用
     8             connection.setAutoCommit(false);
     9         } catch (SQLException e1) {
    10             // TODO Auto-generated catch block
    11             e1.printStackTrace();
    12         }
    13         String sql = "insert into SalesOrder(uid,status) values(?,?)";
    14         try {
    15             // 订单写入数据库
    16             PreparedStatement ps = connection.prepareStatement(sql,
    17                     Statement.RETURN_GENERATED_KEYS);//在添加订单的同时,获得该订单的自动生成的id
    18             ps.setInt(1, so.getCustomer().getCid());
    19             ps.setInt(2, so.getStatus());
    20             ps.executeUpdate();
    21 
    22             // 获得自动生成的新订单号
    23             ResultSet rsKey = ps.getGeneratedKeys();
    24             rsKey.next();
    25             orderId = rsKey.getInt(1);
    26 
    27             // 将所有的订单项写入数据库
    28             String sqlItem = "insert into salesItem(pid,pcount,oid) values(?,?,?)";
    29             PreparedStatement psItem = connection.prepareStatement(sqlItem);
    30             List<SalesItem> items = so.getItems();
    31             Iterator<SalesItem> it = items.iterator();
    32             while (it.hasNext()) {
    33                 SalesItem item = it.next();
    34                 psItem.setInt(1, item.getItem().getProduct().getPid());
    35                 psItem.setInt(2, item.getItem().getCount());
    36                 psItem.setInt(3, orderId);
    37                 psItem.addBatch();//将每个订单项添加操作加入批处理作业中
    38             }
    39             psItem.executeBatch();//执行批处理
    40             connection.commit();//手动提交数据库
    41             ps.close();
    42             psItem.close();
    43 
    44         } catch (SQLException e) {
    45             try {
    46                 connection.rollback();
    47             } catch (SQLException e1) {
    48                 e1.printStackTrace();
    49             }
    50             e.printStackTrace();
    51         } finally {
    52             try {
    53                 connection.setAutoCommit(autoCommit);
    54                 connection.close();
    55                 db.close();
    56             } catch (SQLException e) {
    57                 e.printStackTrace();
    58             }
    59         }
    60         return orderId;
    61     }

    这样做的目的就是只有在我们成功添加新订单后,才可以将购物项加入该订单。以保持数据的一致性

    ps:

    commit的作用:就是把緩沖區的數據提交到數據庫
    autocommit=true就是你無須執行commit,程序就自動幫你執行
    autocommit=false,直到你commit或disconnect才執行commit

  • 相关阅读:
    Android通过包名启动应用程序
    android 通过反射方法获取状态栏高度
    Android在输入法界面监听按键(以返回键为例)
    Android主动弹出输入法
    Android使用内部类自定义控件
    Android中ListView列表Item的圆角效果实现
    Android中关于系统Dialog无法全屏的问题
    Dart学习记录(五)
    Dart学习记录(四)—— 库
    Dart学习记录(三)—— 泛型
  • 原文地址:https://www.cnblogs.com/beast-king/p/4142262.html
Copyright © 2011-2022 走看看