zoukankan      html  css  js  c++  java
  • 跨数据库事务

    /// <summary>
        /// 多数据库服务器事务提交
        /// </summary>
        /// <param name="sqlStrings">key为connName,value为Sql语句</param>
        /// <returns></returns>
        public bool ExecuteMultiTran(List<string[]> sqlStrings)
        {
            bool reval = true;
    
            SqlCommand cmd = new SqlCommand();
            SqlTransaction tran;
            SqlConnection conn;
            //事务对象名,事务对象的集合
            Dictionary<string, SqlTransaction> tranResult = new Dictionary<string, SqlTransaction>();
    
            //conn对象名,对象
            Dictionary<string, SqlConnection> connResult = new Dictionary<string, SqlConnection>();
    
            //当前是否执行成功
            bool isSuccess = true;
    
            //
            List<string> keys = new List<string>();
    
            //通过connName进行循环执行事务
            foreach (string[] sqls in sqlStrings)
            {
                string keyName = sqls[0];
    
                //如果keys中已经存在当前 keyname,说明改conn的已经执行完毕,跳到下一keyname执行
                if (!keys.Contains(keyName))
                {
                    keys.Add(keyName);
    
                    //提交当前conn的事务,如果失败,标记当前事务失败
                    try
                    {
                        conn = CreateConnection(keyName);
                        conn.Open();
                        cmd.Connection = conn;
                        tran = conn.BeginTransaction();
                        cmd.Transaction = tran;
    
                        //记录当前事务
                        tranResult.Add(keyName, tran);
    
                        //记录当前conn
                        connResult.Add(keyName, conn);
    
                        //读取当前conn的sql,执行
                        foreach (string[] sql in sqlStrings)
                        {
                            if (sql[0] == keyName)
                            {
                                cmd.CommandText = sql[1];
                                cmd.ExecuteNonQuery();
                            }
                        }
                    }
                    catch(Exception ex)
                    {
                        isSuccess = false;
                    }
    
                    if (!isSuccess)
                    {
                        break;
                    }
                }
            }
    
            //如果当前事务失败,把执行过的所有事务对象rollBack
            if (!isSuccess)
            {
                foreach (SqlTransaction sqlTran in tranResult.Values)
                {
                    sqlTran.Rollback();
                }
                reval = false;
            }
            else
            {
                foreach (SqlTransaction sqlTran in tranResult.Values)
                {
                    sqlTran.Commit();
                }
            }
            //关闭conn
            foreach (SqlConnection value in connResult.Values)
            {
                if (value.State != ConnectionState.Closed)
                {
                    value.Close();
                }
            }
            return reval;
        }
    
        public SqlConnection CreateConnection(string keyName)
        {
            SqlConnection sqlconn = new SqlConnection(ConfigurationManager.AppSettings[keyName].ToString());
            return sqlconn;
        }


    调用:

    //1.扣减玩家拍币数
        //2.增加玩家保险柜金豆数
        //3.插入拍币兑换记录
        private bool procData(int UserID, int pats, int ConvertRate, string ClientIP)
        {
            List<string[]> sqls = new List<string[]>();
            //1.扣减玩家拍币数
            string sql = "update AccountsInfo set UserPat=UserPat-" + pats + " where UserID=" + UserID;
            sqls.Add(new string[] { "DBAccounts", sql });
            //2.增加玩家保险柜金豆数
            sql = "update GameScoreInfo set InsureScore=InsureScore+" + pats * ConvertRate + " where UserID=" + UserID;
            sqls.Add(new string[] { "DBTreasure", sql });
            //3.插入拍币兑换记录
            sql = "insert into RecordConvertUserpat (RecordID,UserID,CurInsureScore,CurUserPat,ConvertUserPat,ConvertRate,IsGamePlaza,ClientIP,CollectDate) values(";
            sql += ((int)gData.SelectValue("select max(RecordID) from RecordConvertUserpat", "DBRecord", 0) + 1) + ",";
            sql += UserID + ",";
            sql += gData.SelectValue("select InsureScore from GameScoreInfo where UserID=" + UserID, "DBTreasure", 0) + ",";
            sql += gData.SelectValue("select UserPat from AccountsInfo where UserId=" + UserID, "DBAccounts", 0) + ",";
            sql += pats + ",";
            sql += ConvertRate + ",";
            sql += "1,";
            sql += "'" + ClientIP + "',";
            sql += "'" + System.DateTime.Now.ToString() + "'";
            sql += ")";
            sqls.Add(new string[] { "DBRecord", sql });
    
            return gData.ExecuteMultiTran(sqls);
        }
  • 相关阅读:
    常用正则搜集(已验证)
    oracle 如何跨用户查询数据
    SVN状态图标消失的解决方法
    oracle 简单列操作
    正则替换行尾,行末内容
    怎么解决svn清理失败且路径显示乱码问题
    Oracle坑爹入门踩坑篇
    如何过滤datable?
    JS产生模态窗口,关闭后刷新父窗体。(兼容各浏览器)
    6 Jmeter脚本组成和组件搭配
  • 原文地址:https://www.cnblogs.com/vinsonLu/p/3753200.html
Copyright © 2011-2022 走看看