在web开发中的三个层次使用事务
生活随笔
收集整理的這篇文章主要介紹了
在web开发中的三个层次使用事务
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
很多數(shù)據(jù)庫(kù)操作需要進(jìn)行事務(wù),Asp.net下面進(jìn)行事務(wù)大致有3個(gè)層次:?
(1)存儲(chǔ)過程層次的事務(wù)?
(2)Ado.Net層次的事務(wù)?
(3)Asp.Net頁(yè)面層次的事務(wù)?
下面分別舉例:?
首先建立trantest表,字段id(int),test(char)?
為id設(shè)置主鍵(利用主鍵是不允許重復(fù)的特性進(jìn)行事務(wù)測(cè)試)?
假設(shè)數(shù)據(jù)庫(kù)內(nèi)存在記錄id=1,test='test'
(1)?
CREATE?PROCEDURE?Tran1?
as?
begin?tran?
set?xact_abort?on
Insert?Into?trantest?(id,test)values(1,'test')?
Insert?Into?trantest?(id,test)values(2,'test')?
commit?tran?
GO?
set xact_abort on? 表示遇到錯(cuò)誤立即回滾
當(dāng)然你也可以這么寫
CREATE PROCEDURE tran1
as
begin tran
insert into trantest(id,test)values(1,'test')
if(@@error<>0)
?rollback tran
else
?begin
??insert into trantest(id,test)values(2,'test')
??if(@@error<>0)
???rollback tran
??else
???commit tran
?end
GO
(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();?
}?
(3)?
添加引用System.EnterpriseServices.dll?
using?System.EnterpriseServices;?
隨便建立一個(gè)按鈕,在按鈕中進(jìn)行如下操作:
try?
{?
?work1();?
?work2();?
?ContextUtil.SetComplete();?
}?
catch(System.Exception?except)?
{?
?ContextUtil.SetAbort();?
?Response.Write(except.Message);?
}?
然后在頁(yè)面中添加2個(gè)操作,模擬一下在邏輯層調(diào)用不同類中的操作的情況?
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(2,'test')",conn);?
???conn.Open();?
???cmd2.ExecuteNonQuery();?
???conn.Close();?
??}?
修改前臺(tái)頁(yè)面在<%Page后面添加 Transaction="Required" 即可
(1)存儲(chǔ)過程層次的事務(wù)?
(2)Ado.Net層次的事務(wù)?
(3)Asp.Net頁(yè)面層次的事務(wù)?
下面分別舉例:?
首先建立trantest表,字段id(int),test(char)?
為id設(shè)置主鍵(利用主鍵是不允許重復(fù)的特性進(jìn)行事務(wù)測(cè)試)?
假設(shè)數(shù)據(jù)庫(kù)內(nèi)存在記錄id=1,test='test'
(1)?
CREATE?PROCEDURE?Tran1?
as?
begin?tran?
set?xact_abort?on
Insert?Into?trantest?(id,test)values(1,'test')?
Insert?Into?trantest?(id,test)values(2,'test')?
commit?tran?
GO?
set xact_abort on? 表示遇到錯(cuò)誤立即回滾
當(dāng)然你也可以這么寫
CREATE PROCEDURE tran1
as
begin tran
insert into trantest(id,test)values(1,'test')
if(@@error<>0)
?rollback tran
else
?begin
??insert into trantest(id,test)values(2,'test')
??if(@@error<>0)
???rollback tran
??else
???commit tran
?end
GO
(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();?
}?
(3)?
添加引用System.EnterpriseServices.dll?
using?System.EnterpriseServices;?
隨便建立一個(gè)按鈕,在按鈕中進(jìn)行如下操作:
try?
{?
?work1();?
?work2();?
?ContextUtil.SetComplete();?
}?
catch(System.Exception?except)?
{?
?ContextUtil.SetAbort();?
?Response.Write(except.Message);?
}?
然后在頁(yè)面中添加2個(gè)操作,模擬一下在邏輯層調(diào)用不同類中的操作的情況?
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(2,'test')",conn);?
???conn.Open();?
???cmd2.ExecuteNonQuery();?
???conn.Close();?
??}?
修改前臺(tái)頁(yè)面在<%Page后面添加 Transaction="Required" 即可
總結(jié)
以上是生活随笔為你收集整理的在web开发中的三个层次使用事务的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 总时差的计算方法有哪些(总时差的计算方法
- 下一篇: WebService事务处理