2016年3月29日 星期二

[ASP.NET] 資料庫交易

Asp
---------------------------------------------------------------------------
Dim rs
set rs  = Server.CreateObject("ADODB.Recordset")
on error resume next
conn.Begintrans
                                                 
sql= " 資料庫語法
conn.execute(sql)

if err.number=0 then                               
conn.CommitTrans
else
conn.RollbackTrans    
end if


Asp.net
---------------------------------------------------------------


SqlConnection sqlConn = DB.Conn();
sqlConn.Open();
SqlTransaction sqlTrans = sqlConn.BeginTransaction();
SqlCommand sqlComm.Connection = sqlConn;
sqlComm.Transcation = sqlTrans;

sqlConn = DB.Conn();
sqlConn.Open();
sqlTrans = sqlConn.BeginTransaction();
sqlComm.Connection = sqlConn;
sqlComm.Transcation = sqlTrans;
try{
    for(;;){
        strInsertion = "資料庫語法";
        sqlComm.CommandText = strInsertion;
        sqlComm.ExcuteNonQuery();
    }
    sqlTrans.Commit();
}
catch{
    sqlTrans.Rollback();
}
finally{
    sqlConn.Close();
}


※其他人的備註
2011/08/20 新增關於BeginTransaction, Rollback, Commit的測試:
問題:在寫入資料表的時候關掉網頁,對資料表的狀態?
測試方式:
寫一隻無限迴圈程式,不斷讓程式對資料表寫不同的資料,
然後在執行的過程中關掉網頁。
測試結果:
一開始寫程式的時候沒有用try-catch-finally,所以直接把網頁關掉,資料表會被lock起來,強制把IDE的模擬Server程式關掉後才得以解開。資料沒有寫進去。

後來加入try-catch-finally後,執行的過程把網頁關掉,再去查詢資料表,是可以運作的。資料也沒有寫進去,
由測試結果的推論:
try-catch-finally,是去執行try裡面的動作,遇到Exception的時候再強制跳到catch,無論try完或是catch完,最後都執行finally。直接把網頁關掉,也能夠用這個方式catch出來。

SQL的做法應該是在先把資料表的狀態lock住,然後對資料表的修改和寫入都是寫到一個暫存的地方,等到下commit指令以後,才把結果一次倒進資料表裡。總之,今天討論到,如果程式執行很久,使用者在不知情(或是手賤)的情況下關掉網頁,以這種做法來說,不用擔心資料表會被持續lock住。

狼.眼裡的世界