亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

基于TransactionScope類的分布式隱式事務

2019-11-17 01:33:24
字體:
來源:轉載
供稿:網友

基于TransactionScope類的分布式隱式事務

System.Transactions 命名空間中除了上一節中提到的基于 Transaction 類的顯式編程模型,還提供使用 TransactionScope 類的隱式編程模型,它與顯示編程模型相比,更加方便簡單,它也是MSDN中建議使用的編程模型。

下面,我們基于TransactionScope類實現上一節銀行轉帳的例程。

示例代碼:

(1)SqlHelper.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Configuration;
using MySQL.Data.MySqlClient;
using System.Transactions;
using System.Data;
namespace 事務處理
{
    public class SqlHelper
    {
        public static string GetConnection()
        {
            string connStr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            return connStr;
        }
        public static int ExecuteNonQuery(string sql, params MySqlParameter[] parameters)
        {
            int result = -1;
            using (MySqlConnection conn = new MySqlConnection(GetConnection()))
            {
                conn.Open();
                
                using (MySqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = sql;
                    cmd.Parameters.AddRange(parameters);
                    result = cmd.ExecuteNonQuery();
                }
            }
            return result;
        }
        public static DataTable ExecuteDataTable(string sql, params MySqlParameter[] parameters)
        {
            using (MySqlConnection conn = new MySqlConnection(GetConnection()))
            {
                using (MySqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = sql;
                    cmd.Parameters.AddRange(parameters);
                    using (MySqlDataAdapter da = new MySqlDataAdapter(cmd))
                    {
                        using (DataSet ds = new DataSet())
                        {
                            da.Fill(ds);
                            return ds.Tables[0];
                        }
                    }
                }
            }
        }
    }
}

(2)Bankaccountn.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using MySql.Data.MySqlClient;
using System.Data;
using System.Transactions;
namespace 事務處理
{
    public class Bankaccountn
    {
        public Bankaccountn(string bankaccountnId)
        {
            string sql = @"SELECT * FROM Bankaccountn WHERE BankaccountnId=@BankaccountnId;";
            DataTable dt = SqlHelper.ExecuteDataTable(sql, new MySqlParameter("@BankaccountnId", bankaccountnId));
            if (dt.Rows.Count <= 0)
            {
                throw new Exception("賬戶不存在!");
            }
            else if (dt.Rows.Count > 1)
            {
                throw new Exception("異常信息:有重名的賬戶存在!");
            }
            else
            {
                this.bankaccountnId = dt.Rows[0]["BankaccountnId"] as string;
                this.UserName = dt.Rows[0]["UserName"] as string;
                this.Balance = Convert.ToDecimal(dt.Rows[0]["Balance"]);
            } 
        }
        PRivate string bankaccountnId;
        public string UserName
        { 
            get; 
            private set; 
        }
        public decimal Balance
        {
            get;
            private set;
        }
        
        protected int Update()
        {
            string sql = @"UPDATE bankaccountn SET UserName = @UserName,Balance = @Balance 
                           WHERE BankaccountnId= @BankaccountnId;";
            return SqlHelper.ExecuteNonQuery(sql, new MySqlParameter("@BankaccountnId", this.bankaccountnId), new MySqlParameter("@UserName", this.UserName), new MySqlParameter("@Balance", this.Balance));
        }
        public void Epend( decimal money)
        {
            this.Balance -= money;
            this.Update();
        }
        public void Income(decimal money)
        {
            this.Balance += money;
            this.Update();
            
        }
        public bool HiddenTransferOfAccount(string incomeBankaccountnId, decimal money)
        {
            bool result = true;
            using (TransactionScope scope = new TransactionScope())
            {
                try
                {
                    Bankaccountn incomeBankaccountn = new Bankaccountn(incomeBankaccountnId);
                    incomeBankaccountn.Income(money); //收款賬戶入賬
                    this.Epend(money); //付款賬戶支出
                    scope.Complete();
                }
                catch (Exception ex)
                {
                    //這里寫做異常信息的記錄的代碼
                    result = false;
                }
            }
            return result;
        }
    }
    
}

(3)測試代碼

Bankaccountn one = new Bankaccountn("6666660123456789");
if (one.HiddenTransferOfAccount("6666669876543210", 200M))
{
    Response.Write("<scr
}
else
{
    Response.Write("<script>alert('轉賬失敗')</script>");
}

代碼分析:

使用TransactionScope 之后,事務管理器會 預執行代碼,直至Complete()處,如果過程沒有出錯,這通知事務管理器去提交,如果錯誤就不提交,保證了整個執行過程的一致性。

但,在使用隱式編程模型時應注意以下幾點:

1)要確保參與事務的資源(如連接的打開等)的全登記放在TransactionScope 實例化對象之后,調用Complete()方法之前。

2)從TransactionScope 實例化到調用Complete()方法之間的代碼,不要吃掉異常。

using (TransactionScope scope = new TransactionScope())
{
    try
    {
        //要確保參與事務的資源全部登記在這個位置(如連接的打開等)
         Bankaccountn incomeBankaccountn = new Bankaccountn(incomeBankaccountnId);
         incomeBankaccountn.Income(money); //收款賬戶入賬
         this.Epend(money); //付款賬戶支出
         scope.Complete();
    }
    catch (Exception ex)
    {
         //捕獲異常要在這個位置
          result = false;
    }
}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
这里只有精品在线观看| 中国人与牲禽动交精品| 青青草精品毛片| 久久久亚洲福利精品午夜| 国产精品1234| 性色av一区二区咪爱| 国产一区二区三区在线视频| 日韩网站免费观看| 欧美三级欧美成人高清www| 欧美日韩激情美女| 精品国产一区二区三区久久狼5月| 欧美日韩综合视频网址| 欧美性猛交xxxx免费看久久久| 97精品国产aⅴ7777| 国产精品久久久久久久久| 久热精品视频在线观看| 日韩国产欧美精品在线| 亚洲国产另类 国产精品国产免费| 福利视频一区二区| 欧美成人激情在线| 国产精品三级在线| 欧美xxxx14xxxxx性爽| 日韩大片免费观看视频播放| 日韩精品视频三区| 成年人精品视频| 欧美国产精品人人做人人爱| 97色在线观看| 在线观看国产精品淫| 亚洲成人a级网| 欧美午夜片欧美片在线观看| 日韩在线观看免费高清| 国产精品视频区1| 性色av一区二区三区免费| 日韩免费在线播放| 成人a视频在线观看| 精品久久香蕉国产线看观看亚洲| 国产精品自拍网| 秋霞成人午夜鲁丝一区二区三区| 久久久久女教师免费一区| 国产精品成人一区二区三区吃奶| 国产国产精品人在线视| 综合欧美国产视频二区| 亚洲视频777| 国产一区二区三区在线免费观看| 在线观看中文字幕亚洲| 亚洲成人黄色网址| 久久久国产成人精品| 亚洲福利视频在线| 久久久久久高潮国产精品视| www日韩中文字幕在线看| 国产精品美女在线| 精品美女国产在线| 日韩av在线播放资源| 日韩最新在线视频| 久久中国妇女中文字幕| 日韩免费电影在线观看| 中文字幕少妇一区二区三区| 日韩在线观看免费全集电视剧网站| 国产精品aaaa| 3344国产精品免费看| 亚洲aⅴ男人的天堂在线观看| 色与欲影视天天看综合网| 日韩av日韩在线观看| 91久久国产精品| 国产亚洲精品久久久久动| 日韩欧美在线中文字幕| 97国产精品视频人人做人人爱| 中文字幕亚洲无线码在线一区| 97超级碰碰人国产在线观看| 色综合天天狠天天透天天伊人| 日本成人在线视频网址| 亚洲欧美中文在线视频| 91亚洲精品在线| 亚洲天堂av网| 色综合天天综合网国产成人网| 亚洲综合精品伊人久久| 亚洲欧美资源在线| 国产盗摄xxxx视频xxx69| 亚洲成色777777在线观看影院| 国产精品高潮呻吟久久av无限| 国产成人精品综合久久久| 欧美激情在线播放| 亚洲美女精品成人在线视频| 伊人久久久久久久久久久久久| 久久久国产一区| 热re99久久精品国产66热| 91久久夜色精品国产网站| 亚洲人成电影网站色…| 国产精品久久久久久久午夜| 亚洲欧美在线一区| 亚洲国产精品系列| 茄子视频成人在线| 一区二区三区 在线观看视| 91久久精品日日躁夜夜躁国产| 91免费看国产| 亚洲午夜精品久久久久久久久久久久| 亚洲午夜精品视频| 亚洲欧洲免费视频| 黑丝美女久久久| 国产激情视频一区| 国产精品96久久久久久又黄又硬| 51精品国产黑色丝袜高跟鞋| 国内精品视频在线| 亚洲国产91精品在线观看| 成人网欧美在线视频| 亚洲美女又黄又爽在线观看| 日韩欧美在线第一页| 久久精品国产成人| 日韩高清免费观看| 国产精品男人爽免费视频1| 精品日韩视频在线观看| 欧美人成在线视频| 久久999免费视频| 久久久久免费视频| 日韩性xxxx爱| 日韩av免费在线播放| 日韩不卡中文字幕| 久久精品成人欧美大片古装| 国产精品中文在线| 亚洲r级在线观看| 国模精品一区二区三区色天香| 欧美日韩在线影院| 亚洲电影免费观看高清| 人人做人人澡人人爽欧美| 精品久久久久久久久中文字幕| 亚洲精品自在久久| 91九色在线视频| 久久亚洲精品成人| 黑人狂躁日本妞一区二区三区| 浅井舞香一区二区| 黄色一区二区在线观看| 日韩小视频在线观看| 欧美激情视频一区二区三区不卡| 亚洲二区中文字幕| 一本色道久久综合狠狠躁篇怎么玩| 色噜噜狠狠色综合网图区| 欧美精品手机在线| 久久人人爽人人爽人人片av高清| 亚洲黄色片网站| 国产精品69久久| 亚洲淫片在线视频| 久久久国产成人精品| 亚洲激情视频在线| 亚洲国产日韩精品在线| 69久久夜色精品国产69| 成人欧美一区二区三区在线湿哒哒| 91热精品视频| 欧美性受xxxx黑人猛交| 51精品国产黑色丝袜高跟鞋| 国产欧美在线播放| 国产精品高潮呻吟久久av野狼| 美女999久久久精品视频| 日韩禁在线播放| 亚洲人成网站免费播放| 正在播放国产一区| 成人免费在线视频网址| 久久精品国产亚洲一区二区| www日韩中文字幕在线看| 亚洲xxxx3d| 国产精品日韩av| 狠狠爱在线视频一区| 国产欧美在线播放| 成人激情av在线| 日韩黄在线观看|