在進行機房收費系統時,有個學生註冊這麼一個功能。註冊功能需要向Student(學生)表、Card(卡)表、ChargeRecord(充值記錄)表寫入記錄。
當時,在處理這個問題時,存在一個困惑,如果在向資料庫插入資料時,Student表插入成功,Card表或ChargeRecord表未能插入成功怎麼辦?這樣不就導致了資料不一致嗎?
後來通過查筆記,發現在ADO.Net中,有“事務”這麼一致處理機制。事務有原子性、一致性、隔離性、持久性4種特徵,通過“事務”這種處理機制,可以保證資料的一致性。
在ADO.Net中,又分為“本地交易處理”和“分散式交易處理”。“本地交易處理”操作是一個資料庫,“分散式交易處理”操作的是多個資料庫,這是它們的區別。
因為這次只用到了一個資料庫,那我們就先從“本地交易處理”開始學習。
下面讓我用一個小Demo來向大家講解:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data;using System.Data.SqlClient;namespace TransactionDemo{ class Program { static void Main(string[] args) { //聲明一個字串型的數組 string[] categoryName = new string[] { "aaa", "bbb", "ccc", "ddd", "eee" }; //串連資料庫的字串 string strCon = "Data Source=.;Initial Catalog=test;uid=sa;pwd=123456;"; using (SqlConnection con = new SqlConnection(strCon)) { using (SqlCommand cmd = con.CreateCommand()) { con.Open(); //建立一個事務 SqlTransaction trans = con.BeginTransaction(); cmd.Transaction = trans; try { //將數組中的資料分別插入到資料表B中的bID欄位 for (int i = 0; i < categoryName.Length; i++) { string ins = "insert into B(bID) values('" +categoryName[i] + "')"; cmd.CommandText = ins; cmd.ExecuteNonQuery(); } //提交事務 trans.Commit(); } catch (Exception ex) { Console.WriteLine(ex.Message); //如果事務未完成,則復原到初始狀態 trans.Rollback(); } } } } }}
如果全部執行成功,則數組中的資料會插入到資料庫;如果數組中的任何一條資料未能執行成功,則全部插入失敗,復原到初始狀態。
這個情景告訴我們平時要多思考沉澱,多閱讀別人的部落格。通過思考我們可以發現別人沒有注意到的問題,通過閱讀我們可以學習到很多經典問題的解決方案。讓我們都站在巨人的肩膀上,不必在苦苦思索了很久後才發現原來此類問題早已有解決方案的囧境。
希望我的講解能對大家有所協助。