25:事务处理 Transaction 应用

EnTerpriseServices类库

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Transactions;

namespace 隔离级别
{
    class Program
    {
        static void Main(string[] args)
        {
            //脏读:读取了另一个事务正在改变的记录
            //不可重复度:当数据在事务中读取,而该事务运行的同时,另一个事务修改了相同的记录
            //幻读:当一个事务中读取这些记录,另一个事务添加一个属于该范围的新数据

            //可以通过IsolationLevel枚举定义隔离级别

            var options = new TransactionOptions {
                IsolationLevel = IsolationLevel.ReadCommitted,
                Timeout = TimeSpan.FromSeconds(90)
            };

            using (var scope=new TransactionScope(TransactionScopeOption.Required,options))
            {

            }

        }
    }
}

SqlTransaction

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 事务处理
{
    //要么全部完成,要么都不完成
    //事务常用于数据库,但利用Transactions名称空中的类
    //事务处理阶段:激活阶段》准备阶段》提交阶段
    //有ACID属性

    class Program
    {
        static void Main(string[] args)
        {

        }


        public class StudentData {

            public async Task AddStudentAsync(Student student) {

                var connection = new SqlConnection("");
                await connection.OpenAsync();

                //开始事务
                SqlTransaction tx = connection.BeginTransaction();
                try
                {

                    SqlCommand command = connection.CreateCommand();
                    //绑定事务
                    command.Transaction = tx;

                    command.CommandText = "insert into students " +
                        "(FirstName,LastName,Company) values " +
                        "(@FirstName,@LastName,@Company)";

                    command.Parameters.AddWithValue("@FirstName", student.FirstName);
                    command.Parameters.AddWithValue("@LastName", student.LastName);
                    command.Parameters.AddWithValue("@Company", student.Company);

                    await command.ExecuteNonQueryAsync();

                    //提交事务
                    tx.Commit();
                }
                catch (Exception)
                {
                    //回滚事务
                    tx.Rollback();
                }
                finally {

                    connection.Close();
                }

            }
        
        }

    }

    [Serializable]
    public class Student
    {

        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Company { get; set; }
        public int Id { get; set; }

        public override string ToString()
        {
            return String.Format("{0} {1}", FirstName, LastName);
        }
    }
}

Transactions类库

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Diagnostics.Contracts;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Transactions;

namespace Transactions类库
{
    class Program
    {
        static void Main(string[] args)
        {
            TransactionFun transactionFun = new TransactionFun();
             transactionFun.CommittableTransactionAsync();

            #region 事务的升级
            #endregion

            #region 依赖事务
            //使用依赖事务,可以影响来自多个任务或线程的某个事务
            TransactionFun.DependentTransaction();
            #endregion
        }
    }
    //获取事务的工具类
    public static class Utilities
    {

        public static bool AbortTx()
        {

            Console.Write("Abort the Transaction (y/n)?");

            return Console.ReadLine().ToLower().Equals("y");
        }

        public static void DisplayTransactionInformation(string title,
           TransactionInformation ti)
        {

            Contract.Requires<ArgumentNullException>(ti != null);
            Console.WriteLine(title);
            Console.WriteLine("Creation time :{0:T}", ti.CreationTime);
            Console.WriteLine("Status:{0}", ti.Status);
            Console.WriteLine("Local ID:{0}", ti.LocalIdentifier);
            Console.WriteLine("Distributed ID:{0}", ti.DistributedIdentifier);
            Console.WriteLine();
        }
    }

    public class TransactionFun
    {

        public async Task AddStudentAsync(Student student, Transaction tx)
        {

            Contract.Requires<ArgumentNullException>(student != null);

            var connection = new SqlConnection("");
            await connection.OpenAsync();
            try
            {

                if (tx != null)
                {
                    //登记分布式事务
                    connection.EnlistTransaction(tx);

                    SqlCommand command = connection.CreateCommand();
                    command.CommandText = "";
                    command.Parameters.AddWithValue("@FirstName", student.FirstName);

                    await command.ExecuteNonQueryAsync();
                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {

                connection.Close();
            }
        }
        //提交事务等
        public async Task CommittableTransactionAsync()
        {

            var tx = new CommittableTransaction();
            Utilities.DisplayTransactionInformation("TX created", tx.TransactionInformation);


            try
            {
                var s1 = new Student { };
                await AddStudentAsync(s1, tx);

                if (Utilities.AbortTx())
                {

                }

                tx.Commit();
            }
            catch (Exception)
            {

                tx.Rollback();
            }

            Utilities.DisplayTransactionInformation("TX completed", tx.TransactionInformation);

        }


        static void TxTask(object obj) { 
        
            var tx= obj as DependentTransaction;
            Utilities.DisplayTransactionInformation("Dependent Transaction", tx.TransactionInformation);

            Thread.Sleep(3000);
            tx.Complete();

            Utilities.DisplayTransactionInformation("Dependent TX Complete", tx.TransactionInformation);

        }

        public static void DependentTransaction() {

            //1.创建一个根事务
            var tx = new CommittableTransaction();
            Utilities.DisplayTransactionInformation("Root tx created", tx.TransactionInformation);

            //2.DependentCloneOption有两个值,如果根事务在依赖事务提交之前完成,这个选项很重要。RollbackIfNotComplete:如果依赖事务没有
            //在根事务提交之前调用了Complete,事务就会终止。BlockCommitUntilComplete:Commit就会等待所有依赖事务定义的结果
            Task.Factory.StartNew(TxTask, tx.DependentClone(DependentCloneOption.BlockCommitUntilComplete));
            try
            {

                if (Utilities.AbortTx())
                {

                }
                tx.Commit();
            }
            catch (Exception)
            {

                tx.Rollback();
            }

            Utilities.DisplayTransactionInformation("tx finished", tx.TransactionInformation);

        }

    }




    [Serializable]
    public class Student
    {

        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Company { get; set; }
        public int Id { get; set; }

        public override string ToString()
        {
            return String.Format("{0} {1}", FirstName, LastName);
        }
    }
}

隔离级别

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Transactions;

namespace 隔离级别
{
    class Program
    {
        static void Main(string[] args)
        {
            //脏读:读取了另一个事务正在改变的记录
            //不可重复度:当数据在事务中读取,而该事务运行的同时,另一个事务修改了相同的记录
            //幻读:当一个事务中读取这些记录,另一个事务添加一个属于该范围的新数据

            //可以通过IsolationLevel枚举定义隔离级别

            var options = new TransactionOptions {
                IsolationLevel = IsolationLevel.ReadCommitted,
                Timeout = TimeSpan.FromSeconds(90)
            };

            using (var scope=new TransactionScope(TransactionScopeOption.Required,options))
            {

            }

        }
    }
}

环境事务

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Transactions;

namespace 环境事务
{
    class Program
    {
        static void Main(string[] args)
        {
            //使用环境事务就不需要手动连接登记事务
            txFunc.TransactionScopeAsync();

            #region 嵌套的作用域和环境事务
            //嵌套的作用域和环境事务
            using (var scope = new TransactionScope())
            {
                Transaction.Current.TransactionCompleted += txFunc.OnTransactionCompleted;

                Utilities.DisplayTransactionInformation("Ambient TX created",
                      Transaction.Current.TransactionInformation);

                //TransactionScopeOption的值不同,判断是否使用同一作用域
                using (var scope2 = new TransactionScope(TransactionScopeOption.RequiresNew))
                {
                    Transaction.Current.TransactionCompleted += txFunc.OnTransactionCompleted;

                    Utilities.DisplayTransactionInformation("Inner transaction Scope",
                          Transaction.Current.TransactionInformation);

                    scope2.Complete();
                }

                scope.Complete();
            }
            #endregion

        }
    }
    //获取事务的工具类
    public static class Utilities
    {

        public static bool AbortTx()
        {

            Console.Write("Abort the Transaction (y/n)?");

            return Console.ReadLine().ToLower().Equals("y");
        }

        public static void DisplayTransactionInformation(string title,
           TransactionInformation ti)
        {

            System.Diagnostics.Contracts.Contract.Requires<ArgumentNullException>(ti != null);
            Console.WriteLine(title);
            Console.WriteLine("Creation time :{0:T}", ti.CreationTime);
            Console.WriteLine("Status:{0}", ti.Status);
            Console.WriteLine("Local ID:{0}", ti.LocalIdentifier);
            Console.WriteLine("Distributed ID:{0}", ti.DistributedIdentifier);
            Console.WriteLine();
        }
    }

    public class txFunc
    {
        public static async Task TransactionScopeAsync()
        {
            using (var scope = new TransactionScope())
            {
                Transaction.Current.TransactionCompleted += OnTransactionCompleted;

                Utilities.DisplayTransactionInformation("Ambient TX created",
                      Transaction.Current.TransactionInformation);

                var s1 = new Student
                {
                    FirstName = "Angela",
                    LastName = "Nagel",
                    Company = "Kantine M101"
                };
                var db = new StudentData();
                await db.AddStudentAsync(s1);

                if (!Utilities.AbortTx())
                    scope.Complete();
                else
                    Console.WriteLine("transaction will be aborted");

            } // scope.Dispose()

        }

        public static void OnTransactionCompleted(object sender, TransactionEventArgs e)
        {

            Utilities.DisplayTransactionInformation("", e.Transaction.TransactionInformation);

        }

    }
    public class StudentData
    {

        public async Task AddStudentAsync(Student student)
        {

            var connection = new SqlConnection("");
            await connection.OpenAsync();

            //开始事务
            SqlTransaction tx = connection.BeginTransaction();
            try
            {

                SqlCommand command = connection.CreateCommand();
                //绑定事务
                command.Transaction = tx;

                command.CommandText = "insert into students " +
                    "(FirstName,LastName,Company) values " +
                    "(@FirstName,@LastName,@Company)";

                command.Parameters.AddWithValue("@FirstName", student.FirstName);
                command.Parameters.AddWithValue("@LastName", student.LastName);
                command.Parameters.AddWithValue("@Company", student.Company);

                await command.ExecuteNonQueryAsync();

                //提交事务
                tx.Commit();
            }
            catch (Exception)
            {
                //回滚事务
                tx.Rollback();
            }
            finally
            {

                connection.Close();
            }

        }

    }
    [Serializable]
    public class Student
    {

        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Company { get; set; }
        public int Id { get; set; }

        public override string ToString()
        {
            return String.Format("{0} {1}", FirstName, LastName);
        }
    }
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值