zoukankan      html  css  js  c++  java
  • 在业务逻辑中如何进行数据库的事务管理。

    TransactionStatus status = null;

    public Map brokerageCalc(Map param) throws Exception {
            DefaultTransactionDefinition def = new DefaultTransactionDefinition();
            TransactionStatus status = null;

            Map model = new HashMap();
            String oper = "计算";
            try {
                List<Map> payHisList = null;

                if ("R".equals(param.get("brokerageStatue"))) {
                    oper = "重算";
                    // 回滚佣金记录
                    proxyBrokeragedDao.rollbackBrokerageRecord(param);
                    // 待计算列表
                    Map payHisParam = new HashMap();
                    payHisParam.put("brokerageStatue", "R");
                    payHisList = proxyBrokeragedDao.getPayHisNotPaid(payHisParam);
                } else {
                    // 所有待计算列表
                    payHisList = proxyBrokeragedDao.getPayHisNotPaid(null);
                }

                // 佣金费率配置
                Map brokerageSetParam = new HashMap();
                brokerageSetParam.put("sysDate", new Date());
                for (Map payHis : payHisList) {
                    List<ProxyBaseInfo> proxys = new ArrayList(); // 代理链
                    // 获取代理商(是玩家也是代理商)
                    ProxyBaseInfo proxy = proxyBaseInfoDao.getProxyById((String) payHis.get("playerId"));
                    proxys.add(proxy);
                    // 获取佣金费率
                    List<Map> brokerageSetlist;
                    if (proxy == null) {
                        brokerageSetParam.put("type", "PL");
                        brokerageSetlist = proxyBrokeragedDao.getAllBrokerageinfo(brokerageSetParam);
                    } else {
                        brokerageSetParam.put("type", proxy.getType());
                        brokerageSetlist = proxyBrokeragedDao.getAllBrokerageinfo(brokerageSetParam);
                    }

                    Integer maxDepthLevel = getMaxDephLevel(brokerageSetlist);
                    getPascadeProxys((String) payHis.get("playerId"), maxDepthLevel, proxys);

                    // 开启事务
                    status = transactionManager.getTransaction(def);///修改数据的时候 首先开启事务
                    try {
                        for (Map setting : brokerageSetlist) {
                            Integer depthLevel = ((BigDecimal) setting.get("depthLevel")).intValue();
                            ProxyBaseInfo tmpProxy = proxys.get(depthLevel);
                            if (tmpProxy != null && ProxyBaseInfo.TYPE_P.equals(tmpProxy.getType())) { // 正式代理商才計算佣金
                                BigDecimal rate = new BigDecimal(setting.get("rate").toString())
                                        .divide(new BigDecimal("100"));
                                BigDecimal amount = new BigDecimal(payHis.get("amount").toString());
                                BigDecimal brokerage = amount.multiply(rate); // 佣金金额

                                Map brokerageModel = new HashMap();
                                brokerageModel.put("proxyBrokerageRecordId", UUIDGenerator.generatorUUID());
                                brokerageModel.put("payHistoryId", payHis.get("payHistoryId"));
                                brokerageModel.put("playerId", payHis.get("playerId"));
                                brokerageModel.put("proxyBaseInfoId", tmpProxy.getProxyBaseInfoId());
                                brokerageModel.put("proxyBrokerageRecordId", UUIDGenerator.generatorUUID());
                                brokerageModel.put("gameId", null);
                                brokerageModel.put("payTime", payHis.get("payTime"));
                                brokerageModel.put("amount", amount);
                                brokerageModel.put("rate", setting.get("rate"));
                                brokerageModel.put("brokerage", brokerage);
                                brokerageModel.put("depthLevel", depthLevel);
                                brokerageModel.put("statue", "Y");
                                brokerageModel.put("createdBy", "SYSTEM");
                                brokerageModel.put("updatedBy", "SYSTEM");
                                brokerageModel.put("remarks", "直属" + depthLevel + "级,佣金比例:" + setting.get("rate") + " ");
                                proxyBrokeragedDao.insertBrokerageRecord(brokerageModel);

                            }
                        }
                        // 更新支付记录为已计算
                        payHis.put("brokerageStatue", "C");
                        proxyBrokeragedDao.updatePayHis(payHis);
                        // 提交事务
                        transactionManager.commit(status);//跟新完后,需要手动的commit();
                    } catch (Exception e) {
                        if (status != null) {
                            transactionManager.rollback(status);//出了错误,需要手动的回滚所有操作。保持所有一致性
                        }
                        // 发生异常修改支付记录佣金计算状态为异常
                        logger.error("重算充值记录异常:payHistoryId=" + payHis.get("payHistoryId"), e);
                        throw e;
                    }
                }

                model.put("rcode", "0");
                model.put("rmsg", oper + "成功!");
            } catch (Exception e) {
                logger.error("重算异常", e);
                model.put("rcode", "1");
                model.put("rmsg", oper + "失败!");
            }
            return model;
        }

  • 相关阅读:
    innotop 安装和使用
    Waiting for table flush 的原因及处理方法
    input 在 chrome 下 , 自动填充后,默认样式清除
    小米WiFi放大器出现黄灯闪烁,无法使用处理方法
    Error writing file '/tmp/MLLGyECY' (Errcode: 28
    org.apache.activemq.transport.InactivityIOException: Channel was inactive for too (>30000) long: tcp://192.168.120.22:61616
    Apache-Tomcat-Ajp漏洞(CVE-2020-1938)漏洞复现 和处理
    Spring boot CommandLineRunner接口使用例子
    interface21
    interface21
  • 原文地址:https://www.cnblogs.com/softwarewebdesign/p/6708643.html
Copyright © 2011-2022 走看看