在三個層次對Asp.Net的資料操作進行事務

來源:互聯網
上載者:User
asp.net|資料
很多資料庫操作需要進行事務,Asp.net下面進行事務大致有3個層次:
(1)預存程序層次的事務
(2)Ado.Net層次的事務
(3)Asp.Net頁面層次的事務
下面分別舉例:
首先建立trantest表,欄位id(int),test(char)
為id設定主鍵(利用主鍵是不允許重複的特性進行事務測試)

(1)
CREATE PROCEDURE Tran1
as
begin tran
Insert Into trantest (id,test)values(1,'test')
Insert Into trantest (id,test)values(1,'test')
if(@@error=0)
commit tran
else
rollback tran
GO
運行這個預存程序可以發現一條記錄都沒有,說明的確是復原了
清空資料庫的記錄,修改一下這個預存程序
CREATE PROCEDURE Tran1
as
begin tran
Insert Into trantest (id,test)values(1,'test')
Insert Into trantest (id,test)values(2,'test')
if(@@error=0)
commit tran
else
rollback tran
GO
運行這個預存程序可以發現添加了2條記錄,說明的確是提交了事務
清空資料庫的記錄

(2)
SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]);
SqlCommand cmd1=new SqlCommand("Insert Into trantest (id,test)values(1,'test')",conn);
SqlCommand cmd2=new SqlCommand("Insert Into trantest (id,test)values(1,'test')",conn);
conn.Open();
SqlTransaction tran=conn.BeginTransaction();
cmd1.Transaction=tran;
cmd2.Transaction=tran;
try
{
 cmd1.ExecuteNonQuery();
 cmd2.ExecuteNonQuery();
 tran.Commit();
}
catch(SqlException except)
{
 tran.Rollback();
 Response.Write(except.Message);
}
finally
{
 conn.Close();
}
同樣啟動並執行結果是什麼記錄都沒有添加,清空後再修改為
SqlCommand cmd1=new SqlCommand("Insert Into trantest (id,test)values(1,'test')",conn);
SqlCommand cmd2=new SqlCommand("Insert Into trantest (id,test)values(2,'test')",conn);
運行後資料庫內有2條記錄

(3)
添加引用System.EnterpriseServices.dll
using System.EnterpriseServices;

ServiceConfig config = new ServiceConfig();
config.Transaction = TransactionOption.Required;
ServiceDomain.Enter(config);
try
{
 work1();
 work2();
 ContextUtil.SetComplete();
}
catch(System.Exception except)
{
 ContextUtil.SetAbort();
 Response.Write(except.Message);
}
finally
{
 ServiceDomain.Leave();
}

然後在頁面中添加2個操作,類比一下在邏輯層調用不同類中的操作的情況
private void work1()
  {
   SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]);
   SqlCommand cmd1=new SqlCommand("Insert Into trantest (id,test)values(1,'test')",conn);
   conn.Open();
   cmd1.ExecuteNonQuery();
   conn.Close();
  }

  private void work2()
  {
   SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]);
   SqlCommand cmd2=new SqlCommand("Insert Into trantest (id,test)values(1,'test')",conn);
   conn.Open();
   cmd2.ExecuteNonQuery();
   conn.Close();
  }

清空資料庫後運行後發現的確是沒有寫入任何記錄,再次清空資料庫,修改一下work2()
SqlCommand cmd2=new SqlCommand("Insert Into trantest (id,test)values(2,'test')",conn);運行後發現添加了2條記錄。

說明2點:
1、
ServiceConfig config = new ServiceConfig(); 
config.Transaction = TransactionOption.Required; 
ServiceDomain.Enter(config);
到最後的ServiceDomain.Leave(); 表示
在這段中進行了事務,如果要簡單的為整個頁面進行事務,修改如下
try
{
    work1();
    work2();
    ContextUtil.SetComplete();

}
catch(System.Exception except)
{
    ContextUtil.SetAbort();
    Response.Write(except.Message);
}
這樣就可以了,還有別忘記在前台的Page中加上
Transaction="Required"
2、不要在work1()、work2()中再添加try{}catch{}代碼塊了
3、因為我的機器是xp sp2,沒有注意到這個問題,經思歸大哥提醒,恍然大悟,補充一點,有平台限制,只能在windos2003或者xp xp2中運用,否則會給出"當前平台上不支援“ServiceConfig”的異常資訊,等有機會自己再測試一下。要在xp sp1中使用可以下載補丁,參考:
http://www.alexthissen.nl/Weblog/PermaLink.aspx?Guid=f6d61461-d336-40b0-9f4d-51eab6650f27
http://www.rm.com/Support/GeneralDownload.asp?cref=DWN222592&nav=0


相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。