• C# Transaction 事务处理


    class

     1 //student
     2  [Serializable]
     3     public class Student
     4     {
     5         public string FirstName { get; set; }
     6         public string LastName { get; set; }
     7         public string Company { get; set; }
     8         public int Id { get; set; }
     9 
    10         public override string ToString()
    11         {
    12             return String.Format("{0} {1}", FirstName, LastName);
    13         }
    14     }
    15 
    16 //student 处理类
    17  public async Task AddStudentAsync(Student student, Transaction tx)
    18         {
    19             SqlConnection connection = new SqlConnection(Settings.Default.CourseConnection);
    20             await connection.OpenAsync();
    21             try
    22             {
    23                 if (tx != null)
    24                     connection.EnlistTransaction(tx);
    25                 SqlCommand command = connection.CreateCommand();
    26                 command.CommandText = "INSERT INTO Students (FirstName, LastName, Company) " +
    27                "VALUES (@FirstName, @LastName, @Company)";
    28                 command.Parameters.AddWithValue("@FirstName", student.FirstName);
    29                 command.Parameters.AddWithValue("@LastName", student.LastName);
    30                 command.Parameters.AddWithValue("@Company", student.Company);
    31                 await command.ExecuteNonQueryAsync();
    32             }
    33             catch (Exception ex)
    34             {
    35                 Trace.WriteLine("AddStudentAsync(Student student, Transaction tx) Error :" + ex.Message);
    36                 throw;
    37             }
    38             finally
    39             { connection.Close(); }
    40         }
    41 
    42 //操作类
    43   public static class Utilities
    44     {
    45        public static bool AbortTx()
    46        {
    47            Console.Write("Abort the Transaction (y/n)?");
    48            return Console.ReadLine().ToLower().Equals("y");
    49        }
    50        public static void DisplayTransactionInformation(string title, TransactionInformation ti)
    51        {
    52            Contract.Requires<ArgumentNullException>(ti != null);
    53 
    54            Console.WriteLine(title);
    55            Console.WriteLine("Creation Time: {0:T}", ti.CreationTime);
    56            Console.WriteLine("Status: {0}", ti.Status);
    57            Console.WriteLine("Local ID: {0}", ti.LocalIdentifier);
    58            Console.WriteLine("Distributed ID: {0}", ti.DistributedIdentifier);
    59            Console.WriteLine();
    60        }
    61     }
    View Code

    执行类

     1   static void Main(string[] args)
     2         {
     3            Task t= CommittableTransactionAsync();
     4            t.Wait();
     5         }
     6         static async Task CommittableTransactionAsync()
     7         {
     8             var tx = new CommittableTransaction();
     9             Utilities.DisplayTransactionInformation("TX created", tx.TransactionInformation);
    10 
    11             try
    12             {
    13                 var s1 = new Student() { FirstName = "Stephanie", LastName = "Nage1", Company = "China" };
    14                 var db = new StudentData();
    15                 await db.AddStudentAsync(s1,tx);
    16 
    17                 var s2 = new Student() { FirstName = "Stephanie2", LastName = "Nage2", Company = "China" };
    18                 await db.AddStudentAsync(s2, tx);
    19 
    20                 Utilities.DisplayTransactionInformation("2nd connection enlisted ", tx.TransactionInformation);
    21 
    22                 if(Utilities.AbortTx())
    23                 {
    24                     throw new ApplicationException("transaction abort");
    25                 }
    26                 tx.Commit();
    27             }
    28             catch (Exception ex)
    29             {
    30                 Console.WriteLine(ex.Message);
    31                 Console.WriteLine();
    32                 tx.Rollback();
    33             }
    34             Utilities.DisplayTransactionInformation("TX completed", tx.TransactionInformation);
    35         }
  • 相关阅读:
    UVA 11995
    LA 5031
    防卫导弹
    跳马问题
    UVA 11992
    POJ 3264 Balanced Lineup
    0-1背包
    石子合并
    小技巧
    Android广播中有序和无序的区别
  • 原文地址:https://www.cnblogs.com/farmer-y/p/6108748.html
Copyright © 2020-2023  润新知