2013/10/10

C#.Net Transaction

Transaction的意思是交易,所謂的交易可以談論到ATM、超商、線上寶物交易以及股票等等
在這邊我們舉超商作為例子,在超商內有位消費者A跟店員B購買棒棒糖一隻,拿到櫃台時掏出錢包並且結帳,獲得棒棒糖的瞬間交易成功

在超商內有位消費者A跟店員B購買棒棒糖一隻,拿到櫃台並掏出錢包時,因為錢包內不夠錢,所以消費者A或店員B將該樣物品放到貨物架上時,交易失敗

交易不只可以買到單一樣物品,甚至可以買到N樣物品,用這種觀念下去就會知道如何使用交易的功能了,使用前要確認Database有支援交易功能


 MySqlTransaction transaction = null;

 try
 {
  using(MySqlConnection conn = new MySqlConnection("connStr")){

   conn.Open();
   transaction = conn.BeginTransaction();

   sql = "INSERT INTO `test` VALUES (@a, @b, @c, @d)";
   MySqlCommand cmd = new MySqlCommand(sql, conn, transaction);

   cmd.Parameters.AddWithValue("a", account);
   cmd.Parameters.AddWithValue("b", password);
   cmd.Parameters.AddWithValue("c", mail);
   cmd.Parameters.AddWithValue("d", mail);
   cmd.ExecuteNonQuery();

   sql = "INSERT INTO `test2` VALUES (@a, @b, @c, @d)";
   cmd = new MySqlCommand(sql, conn, transaction);

   cmd.Parameters.AddWithValue("a", account);
   cmd.Parameters.AddWithValue("b", password);
   cmd.Parameters.AddWithValue("c", mail);
   cmd.Parameters.AddWithValue("d", mail);
   cmd.ExecuteNonQuery();

   sql = "INSERT INTO `test3` VALUES (@a, @b, @c, @d)";
   cmd = new MySqlCommand(sql, conn, transaction);

   cmd.Parameters.AddWithValue("a", account);
   cmd.Parameters.AddWithValue("b", password);
   cmd.Parameters.AddWithValue("c", mail);
   cmd.Parameters.AddWithValue("d", mail);
   cmd.ExecuteNonQuery();

   transaction.Commit();
 }
 catch (MySqlException ex)
 {
  transaction.Rollback();
  MessageBox.Show("Error Number:" + ex.Number + "\n" + ex.Message + "\n" + ex.Source + "\n" + ex.TargetSite);
 }


交易成功應該不會有Exception出現,所以透過transaction.Commit()去完成交易
交易失敗可能會透過Exception去攔截到,所以透過transaction.Rollback()去將交易取消

忘記輸入transaction.Commit(),則該筆交易也不會執行喔!

參考資料:
http://social.msdn.microsoft.com/Forums/zh-TW/209a2595-4219-4597-828e-e4efc80d3ef6/c-transaction-?forum=233
http://msdn.microsoft.com/zh-tw/library/system.data.odbc.odbccommand.transaction.aspx
http://msdn.microsoft.com/zh-tw/library/1hfx49zc(VS.85).aspx
http://pvencs.blogspot.tw/2012/07/c-adonet-transaction.html
http://tw.myblog.yahoo.com/karate-jb/article?mid=591&prev=592&next=587
http://tw.myblog.yahoo.com/jw!UIpaLOyBBQRqPnlwtNFErQ--/article?mid=341