在這邊我們舉超商作為例子,在超商內有位消費者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