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

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

基于 Transaction 類的分布式顯式事務

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

基于 Transaction 類的分布式顯式事務

自.NET2.0以來增加了System.Transactions命名空間,為.NET應用程序帶來了一個新的事務編程模型。

這個命名空間提供了幾個依賴的TransactionXXX類。Transaction是所有事務處理類的基類,并且定義了所有事務類都可以使用的屬性、方法和事件。CommittableTransaction是唯一個支持提交的事務類,這個類有一個Commit()方法,所有其他事務類都只能執行回滾。

本文將通過銀行轉賬的示例介紹基于 Transaction 類的分布式顯式事務的用法。

MySQL中建立如下表:

image

注意Balance是無符號的decimal類型(如下圖)

image

插入測試數據:

(轉賬成功的測試數據):

image

(轉賬失敗的測試數據):

image

示例代碼:

(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(Transaction transaction,string sql,params MySqlParameter[] parameters)
        {
            int result = -1;
            using (MySqlConnection conn = new MySqlConnection(GetConnection()))
            {
                conn.Open();
                if (null != transaction)
                {
                    conn.EnlistTransaction(transaction);    //將連接登記到事務
                }
                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(Transaction transaction)
        {
            string sql = @"UPDATE bankaccountn SET UserName = @UserName,Balance = @Balance 
                           WHERE BankaccountnId= @BankaccountnId;";
            return SqlHelper.ExecuteNonQuery(transaction, sql, new MySqlParameter("@BankaccountnId", this.bankaccountnId), new MySqlParameter("@UserName", this.UserName), new MySqlParameter("@Balance", this.Balance));
        }
        #region 支出 + Epend(Transaction transaction, decimal money)
        public void Epend(Transaction transaction, decimal money)
        {
            this.Balance -= money;
            this.Update(transaction);
        }
        #endregion
        #region 收入 + Income(Transaction transaction, decimal money)
        public void Income(Transaction transaction, decimal money)
        {
            this.Balance += money;
            this.Update(transaction);
        }
        #endregion
        public bool TransferOfAccount(string incomeBankaccountnId, decimal money)
        {
            using (var transaction = new CommittableTransaction())
            {
                try
                {
                    Bankaccountn incomeBankaccountn = new Bankaccountn(incomeBankaccountnId);
                    incomeBankaccountn.Income(transaction, money); //收款賬戶入賬
                    this.Epend(transaction, money); //付款賬戶支出
                    transaction.Commit();
                    return true;
                }
                catch 
                {
                    transaction.Rollback();
                    //這里寫做異常信息的記錄的代碼
                    return false; 
                }
            }
        }
    }
    
}

(3)測試代碼

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

代碼分析:

創建基于 Transaction 類的分布式顯式事務步驟如下:

1)實例化一個可提交的CommittableTransaction對象;

2)將要參與事務的連接通過MySqlConnection對象的EnlistTransaction(Transaction transaction)登記到上一步創建的CommittableTransaction對象上;

3)如果事務可以成功完成,使用CommittableTransaction對象的Commit()方法提交事務處理結果;

4)如果事務處理中發生錯誤,就調用CommittableTransaction對象的Rollback()方法,撤銷每一個修改。



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美性猛交99久久久久99按摩| 日韩中文字幕视频| 日韩在线激情视频| 国产精品久久久久久av下载红粉| 久久成年人视频| 国产欧美日韩中文| 成人免费在线网址| 91精品国产高清自在线| 欧美激情精品久久久久久| 精品丝袜一区二区三区| 欧美在线视频导航| 亚洲国产另类久久精品| 在线播放国产一区中文字幕剧情欧美| 成人福利网站在线观看| 91麻豆国产语对白在线观看| 日韩成人中文电影| 91理论片午午论夜理片久久| 91国内精品久久| 久久亚洲精品一区| 亚洲人成电影网站色www| 国产精品国产三级国产aⅴ浪潮| 久久综合国产精品台湾中文娱乐网| 欧美日韩免费观看中文| 美女福利精品视频| 日韩精品视频在线播放| 欧美精品免费在线观看| 日韩欧美在线视频日韩欧美在线视频| 欧美精品aaa| 91最新在线免费观看| 欧美日韩性视频在线| 国产丝袜一区二区三区| 久久久久久国产三级电影| 亚洲成人黄色在线| 亚洲国产精品网站| 日韩中文字幕网| 成人性教育视频在线观看| 亚洲性av网站| 久久精品久久久久久| 久久精品国产亚洲7777| 91中文字幕在线| 亚洲精品丝袜日韩| 黑丝美女久久久| 亚洲欧洲av一区二区| 亚洲国产女人aaa毛片在线| 亚洲国产精品久久久久秋霞不卡| 国内揄拍国内精品| 日韩精品极品视频免费观看| 国产精品欧美亚洲777777| 中文字幕久精品免费视频| 日韩在线视频观看| 精品久久久久久国产91| 亚洲精品电影网站| 狠狠躁夜夜躁人人爽天天天天97| 91大神福利视频在线| 欧美午夜精品久久久久久浪潮| 欧美专区日韩视频| 国产一区二区丝袜高跟鞋图片| 国产美女91呻吟求| 91精品国产综合久久男男| 亚洲精品免费在线视频| 国产女同一区二区| 成人网在线免费观看| 亚洲性猛交xxxxwww| 国产成人激情小视频| 日韩大片免费观看视频播放| 日韩欧美在线视频日韩欧美在线视频| 欧洲成人在线观看| 亚洲欧美国产高清va在线播| 91久久久精品| 欧美视频裸体精品| 久热精品视频在线观看一区| 色妞在线综合亚洲欧美| 亚洲精品国产成人| 性欧美亚洲xxxx乳在线观看| 日韩的一区二区| 岛国精品视频在线播放| 日韩av在线资源| 国产成人av网| 国产精品视频专区| 欧美精品久久久久久久| 亚洲国产欧美日韩精品| 中文字幕日韩欧美精品在线观看| 中文字幕亚洲一区| 国产欧美日韩免费看aⅴ视频| 亚洲国内精品视频| 欧美日韩国产麻豆| 欧美成人精品在线视频| 亚洲男人天堂2024| 亚洲自拍欧美另类| 色婷婷成人综合| 中文字幕日韩精品有码视频| 成人黄色午夜影院| 91亚洲国产精品| 精品美女国产在线| 色偷偷综合社区| 欧美黑人一区二区三区| 国产精品极品尤物在线观看| 欧美激情久久久久久| 亚洲第一综合天堂另类专| 68精品久久久久久欧美| 97视频在线观看亚洲| 亚洲视频欧美视频| 欧美综合第一页| 九九热99久久久国产盗摄| 中文字幕在线精品| 久久香蕉频线观| 91久久久久久久久久久久久| 欧美色道久久88综合亚洲精品| 亚洲精品成人久久| 激情懂色av一区av二区av| 久久香蕉国产线看观看网| 日韩精品欧美国产精品忘忧草| 国产女人18毛片水18精品| 久久国产精品久久精品| 国产精品久久97| 欧美巨乳在线观看| 黑人精品xxx一区一二区| 久久成人精品视频| 一区二区欧美久久| 欧美性猛交xxxx偷拍洗澡| 亚洲欧美国产va在线影院| 最近中文字幕2019免费| 成人在线视频网站| 国产日韩在线播放| 一区二区三区黄色| 久久国产精品久久久久久久久久| 久久久av亚洲男天堂| 疯狂做受xxxx欧美肥白少妇| 亚洲国产欧美在线成人app| 在线免费观看羞羞视频一区二区| 日韩亚洲精品视频| 91av在线精品| 久久久成人的性感天堂| 久久久国产一区二区三区| 亚洲欧洲国产精品| 超碰日本道色综合久久综合| 91久久久久久久| 欧美成人sm免费视频| 欧美视频在线免费看| 国产又爽又黄的激情精品视频| 久久久精品影院| 国产精品对白刺激| 成人高h视频在线| 国产91精品久久久| 亚洲国产精久久久久久久| 国产精品678| 成人精品久久一区二区三区| 色老头一区二区三区| 国产精品美腿一区在线看| 狠狠综合久久av一区二区小说| 91久久国产综合久久91精品网站| 在线看欧美日韩| 欧美亚洲免费电影| 日韩av免费网站| 欧美日韩激情视频8区| 亚洲free嫩bbb| 国产色综合天天综合网| 亚洲精品av在线播放| 国产精品久久国产精品99gif| 欧洲永久精品大片ww免费漫画| 国产偷亚洲偷欧美偷精品| 亚洲一区二区久久久久久久| 粗暴蹂躏中文一区二区三区| 国产一区二区丝袜高跟鞋图片|