很多數(shù)據(jù)庫(kù)操作需要進(jìn)行事務(wù),asp.net下面進(jìn)行事務(wù)大致有3個(gè)層次:
(1)存儲(chǔ)過(guò)程層次的事務(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)然你也可以這么寫(xiě)
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)用不同類(lèi)中的操作的情況
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" 即可注冊(cè)會(huì)員,創(chuàng)建你的web開(kāi)發(fā)資料庫(kù),