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