首页 > 代码库 > JSP---网上商城->手动提交事务,保证数据一致性
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 block11 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);//在添加订单的同时,获得该订单的自动生成的id18 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
JSP---网上商城->手动提交事务,保证数据一致性
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。