在三個層次對Asp.Net的資料操作進行事務
最後更新:2017-02-28
來源:互聯網
上載者: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