ASP.NET事務(wù)相關(guān)技巧介紹說明
希望我對(duì)ASP.NET事務(wù)一點(diǎn)經(jīng)驗(yàn)?zāi)芙o大家?guī)韼椭?,?dǎo)致WebDeployment出錯(cuò)的原因也許還有很多,不過在你遇到錯(cuò)誤時(shí),可以先檢查一下你程序中的字符串,暫時(shí)把他們置為””,試試看。沒準(zhǔn)就是他引起的問題啊。
創(chuàng)建一個(gè)ADO.NET事務(wù)是很簡(jiǎn)單的,僅僅是標(biāo)準(zhǔn)代碼的一個(gè)小的擴(kuò)展。ASP.NET事務(wù)只要你知道如何使用ADO.NET來訪問數(shù)據(jù)庫(kù),那就差不多知道了。區(qū)別僅僅是你需要把代碼放到一個(gè)事務(wù)上下文中。
還是原來的ADO.NET類庫(kù)引用,在實(shí)現(xiàn)事務(wù)的類裏面引入System.Data和System.Data.SqlClient類庫(kù),為了執(zhí)行一個(gè)事 務(wù),你需要?jiǎng)?chuàng)建一個(gè)SqlTransation對(duì)象,可以調(diào)用你的SqlConnection對(duì)象BeginTransation()方法來創(chuàng)建它,一旦 你把SqlTransation對(duì)象存為本地變數(shù),ASP.NET事務(wù)你就可以把它賦給你的SqlCommand對(duì)象的事務(wù)屬性,或者把它作為構(gòu)
造器的一個(gè)參數(shù)來創(chuàng)建 SqlCommand。在執(zhí)行SqlCommand動(dòng)作之前,你必須調(diào)用BeginTransaction()方法,ASP.NET事務(wù)然後賦給SqlCommand事務(wù)屬 性。一單事務(wù)開始了,你就可以執(zhí)行任何次數(shù)的SqlCommand動(dòng)作,只要它是屬於同一個(gè)事務(wù)和連接。最後你可以調(diào)用SqlTransation的Commit()方法來提交事務(wù)。#t#
ADO.NET事務(wù)實(shí)際上是把事務(wù)上下文傳遞到數(shù)據(jù)庫(kù)層,如果事務(wù)中發(fā)生一個(gè)錯(cuò)誤,ASP.NET事務(wù)庫(kù)會(huì)自動(dòng)回滾。在你的錯(cuò)誤處理代碼中,每次調(diào)用Rollback ()方法之前檢查事務(wù)對(duì)像是否存在是一種良好的習(xí)慣。這樣的一個(gè)例子是當(dāng)一個(gè)死鎖發(fā)生的同時(shí),數(shù)據(jù)庫(kù)正在執(zhí)行自動(dòng)回滾。優(yōu)勢(shì):
◆ 簡(jiǎn)單性
◆ 和數(shù)據(jù)庫(kù)事務(wù)差不多的快
◆ 事務(wù)可以跨越多個(gè)數(shù)據(jù)庫(kù)訪問
◆ 獨(dú)立於數(shù)據(jù)庫(kù),不同數(shù)據(jù)庫(kù)的專有代碼被隱藏了
限制:
事務(wù)執(zhí)行在數(shù)據(jù)庫(kù)ASP.NET事務(wù)上,所以你需要在事務(wù)過程中手動(dòng)的維護(hù)一個(gè)連接
例子:
- public int purchaseitem(int customerId, int itemId, int itemQty)
- {
- SqlConnection con = null;
- SqlTransaction tx = null;
- int orderId = 0;
- try
- {
- con = new SqlConnection("Data Source=localhost; user
- Id=sa;password=;Initial Catalog=trans_db;");
- con.Open();
- tx = con.BeginTransaction(IsolationLevel.Serializable);
- String updatesqltext = "UPDATE inventory SET qtyinstockqtyinstock
- = qtyinstock - " + itemQty.ToString()
- + " WHERE inventory.productid = " + itemId.ToString();
- SqlCommand cmd = new SqlCommand(updatesqltext, con, tx);
- cmd.ExecuteNonQuery();
- // String is 2 SQL statements: the first is the insert,
- the second selects the identity column
- String insertsqltext = "INSERT INTO orders VALUES
- (" + customerId.ToString() + "," + itemId.ToString()
- + "," + itemQty.ToString() + " , getdate() ); SELECT @@IDENTITY";
- cmd.CommandText = insertsqltext;
- // Retrieve the order id from the identity column
- orderId = Convert.ToInt32(cmd.ExecuteScalar());
- cmd.Dispose();
- tx.Commit();
- }
ASP.NET事務(wù)可以說是在.Net平臺(tái)上事務(wù)實(shí)現(xiàn)方式中最簡(jiǎn)單的一種,你僅僅需要加一行代碼。在ASPX的頁(yè)面聲明中加一個(gè)額外的屬性,即是事務(wù)屬 性,它可以有 如下的值:Disabled (缺省), NotSupported, Supported, Required 和 RequiresNew,這些設(shè)置和COM+以及企業(yè)級(jí)服務(wù)中的設(shè)置一樣,ASP.NET事務(wù)典型地如果你想在頁(yè)面上下文中運(yùn)行事務(wù),那麼要設(shè)置為Required。如果頁(yè) 面中包含有用戶控件,那麼這些控件也會(huì)包含到事務(wù)中,事務(wù)會(huì)存在於頁(yè)面的每個(gè)地方。