跨數據庫事務


/// <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);
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM