2014年9月23日 星期二

[SQL] 練習transaction

webform :

transaction
1.在執行中間有出錯,所有的刪除都會返回原始狀態



  1.   string str1 = @"DELETE LineItem where OrderId = @OrderId;"// SQL command 1
  2.  
  3.             string str2 = @"DELETE OrderStatus where OrderId = @OrderId;"// SQL command 2
  4.  
  5.             string str3 = @"DELETE Orders where OrderId = @OrderId;"// SQL command 2
  6.  
  7.  
  8.             SqlConnection conn = NEW SqlConnection(SqlHelper.ConnectionStringOrderDistributedTransaction);
  9.             SqlCommand delCommand = NEW SqlCommand(str1, conn);
  10.             SqlParameter param = NEW SqlParameter("@OrderId", 2);
  11.             delCommand.Parameters.ADD(param);
  12.  
  13.             conn.OPEN();
  14.             SqlTransaction trans = conn.BeginTransaction();
  15.             delCommand.TRANSACTION = trans;
  16.  
  17.             try
  18.             {
  19.                 delCommand.ExecuteNonQuery();
  20.                 delCommand.CommandText = str2;
  21.                 delCommand.CommandType = CommandType.Text;
  22.                 delCommand.ExecuteNonQuery();
  23.                 delCommand.CommandText = str3;
  24.                 delCommand.CommandType = CommandType.Text;
  25.                 delCommand.ExecuteNonQuery();
  26.  
  27.                 trans.Commit();
  28.             } // try
  29.             catch (Exception excep)
  30.             {
  31.                 trans.ROLLBACK();  // 出現例外就ROLLBACK
  32.                 logger.Debug(excep.Message);
  33.             } // catch
  34.             finally
  35.             {
  36.                 conn.Close();
  37.                 delCommand.Dispose();
  38.                 conn.Dispose();
  39.                 trans.Dispose();
  40.             } // finally



2014年9月13日 星期六

[C#] 執行緒練習

一看就懂


  1.  class Program
  2.     {
  3.         static bool _done;
  4.         private static readonly object _locker = new object();
  5.         static void Main(string[] args)
  6.         {
  7.             /*
  8.             //a.執行序,並指定委派
  9.             Thread t = new Thread(WriteY);
  10.             t.Start();
  11.             //a.同時,do something on the main thread.
  12.             for (int i = 0; i < 1000; i++)
  13.             {
  14.                 Console.Write('x');
  15.             }

  16.             //b.當前執行序名稱
  17.             Console.Write(Thread.CurrentThread.Name);
  18.             */
  19.             /*
  20.             //c.join 等待此執行序結束
  21.             Thread t = new Thread(Go);
  22.             t.Start();
  23.             t.Join();
  24.             //c.休眠 Thread.Sleep(0) Thread.Yield()
  25.             Thread.Sleep(TimeSpan.FromSeconds(5));      //封鎖此執行緒五秒
  26.             Console.WriteLine("Thread  t has ended");
  27.             */
  28.            
  29.             /*
  30.             //d.Shared State  
  31.             //因為兩個執行緒都在同一個實體呼叫GOGO,所以共享_done field,結果就只會顯示一次
  32.             Program tt = new Program();     //create a common instance
  33.             new Thread(tt.GoGo).Start();
  34.             tt.GoGo();
  35.             //d.Lambda 表示式也會產生 Shared State  
  36.             bool done = false;
  37.             ThreadStart action = () =>
  38.             {
  39.                 if (!done)
  40.                 {
  41.                     {
  42.                         done = true;
  43.                         Console.Write("Done");
  44.                     }
  45.                 }
  46.             };
  47.             new Thread(action).Start();
  48.             action();
  49.             */
  50.             /*
  51.             //e.為了避免shared state影響程式
  52.             //  使用lock保護值性序安全性(thread-safe)
  53.             new Thread(LockGo).Start();
  54.             LockGo();
  55.             */
  56.             //f. 變數i都指向同一個same memory location
  57.             for (int i = 0; i < 10; i++)
  58.             {
  59.                 new Thread(() => Console.Write(i)).Start();
  60.             }
  61.             for (int i = 0; i < 10; i++)
  62.             {
  63.                 int temp = i;
  64.                 new Thread(() => Console.Write(temp)).Start();
  65.             }
  66.         }
  67.         static void LockGo()
  68.         {
  69.             //鎖定
  70.             lock (_locker)
  71.             {
  72.                 if (!_done)
  73.                 {   //所以不用擔心執行緒會同時進來,產生兩個Done問題
  74.                     Console.Write("Done");
  75.                     _done = true;
  76.                 }
  77.             }
  78.         }
  79.         private void GoGo()
  80.         {
  81.             //第二個執行緒 因為_done變成true所以沒反應
  82.             if (!_done)
  83.             {
  84.                 _done = true;
  85.                 Console.WriteLine("Done");
  86.             }
  87.             else
  88.             {
  89.                 Console.WriteLine("//第二個執行緒 因為_done變成true所以沒反應");
  90.             }
  91.         }
  92.         private static void Go(object obj)
  93.         {
  94.             for (int i = 0; i < 100; i++)
  95.             {
  96.                 Console.Write('x');
  97.             }
  98.         }
  99.         private static void WriteY(object obj)
  100.         {
  101.             for (int i = 0; i < 1000; i++)
  102.             {
  103.                 Console.Write("y");
  104.             }
  105.         }
  106.     }