事务

对事务的理解:由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成,如果事务过程中出错回滚事务

特点:

原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
 
应用实例(手机银行后管用到)
    private void register()  {
        log.debug("T0111Action execute Register begin ...");

        RegisterBean bean = (RegisterBean) XMLParserUtil.parse(xmlContent);

        Map<String, Object> params = new HashMap<String, Object>();
        params.put("cardNo", bean.getCardNo());
        params.put("cardType", bean.getCardType());
        params.put("globalId", bean.getGlobalId());
        params.put("globalType", bean.getGlobalType());
        params.put("phoneNo", bean.getPhoneNo());
        params.put("remark", bean.getRemark());
        params.put("password", bean.getPassword());
        params.put("custName", bean.getCustName());
        params.put("custNum", bean.getCustNum());
        params.put("birthDate", bean.getBirthDate());
        params.put("adress", bean.getAdress());
        params.put("gender", bean.getGender());
//        yuxin add bankId
          params.put("bankId", bean.getBankId());
        try {
            SysProperty sp = new SysProperty( Consts.SMS_KEY_IP, Consts.SMS_KEY_PORT );
            sp.setMaxConn(20);
            CardAuthManager.setAPIProperty( sp );
            // 获取绑定短信令牌编号,该编号和用户进行绑定
                String sms_key = CardAuthManager.getNewSMSCard(Consts.SMS_CARD_TYPE);
            
            if (checkRegisterParams(bean, params)) {
          //开启事务,到关闭事务之前是一个不可分割的工作单位,过程出错回滚 t0101Service.getIbatisDao().getSqlMapClient().startTransaction();
/** * 客户信息保存到CUST_INFO表 */     int custId = t0101Service.selectId("select SEQ_CUST_INFO.NEXTVAL FROM DUAL"); params.put("custId", custId); params.put("orgId", bean.getOrgId()); params.put("regDate", DateUtil.todayStr()); params.put("sms_key", sms_key); // 1) 向cust_info表中添加数据 t0101Service.insertByCust(params); /* * 变更主键,添加加挂帐号 */ params.put("addChannel", "1"); params.put("addDate", DateUtil.todayStr()); String custNameStr = bean.getCardNo(); if (custNameStr.length() > 10) { custNameStr = custNameStr.substring(custNameStr.length() - 4, custNameStr.length()); } params.put("alias", custNameStr); params.put("accName", getValue(params.get("custName"))); params.put("mainAcc", "1"); // 2) 向acc_info表中添加数据 t0101Service.insertByAcc(params); // 保存操作日志记录      int logid = t0101Service.selectId("select SEQ_OPERATION_LOGS.NEXTVAL FROM DUAL"); this.saveOperLogs(loginService, logid, "", "客户签约", params.get("custName") +
          "用户签约成功!签约账号为:" + bean.getCardNo(),
            bean.getBankId()); t0101Service.getIbatisDao().getSqlMapClient().commitTransaction(); //提交事务 xmlStr
= XMLParserUtil.makeResponseXmlStr("1", "签约成功", "000000", logid + "", "1"); } } catch(Exception e) { try { t0101Service.getIbatisDao().getSqlMapClient().getCurrentConnection().rollback(); //出现异常回滚事务 } catch (SQLException e1) { e1.printStackTrace(); } e.printStackTrace(); } finally { try { t0101Service.getIbatisDao().getSqlMapClient().endTransaction(); //事务结束
    } catch (SQLException e) { e.printStackTrace(); } } log.debug("T0111Action execute Register end ..."); }



posted @ 2015-06-19 15:36  余欣  阅读(238)  评论(0编辑  收藏  举报