談asp中資料庫的交易處理及技巧

來源:互聯網
上載者:User

看過不少朋友的代碼,包括一些學了挺長時間的朋友,在對資料庫的處理當中從來不使用事務,或者有些雖然使用了交易處理,但並沒有達到他們所預期的效果。實際上,真正要做一個商業化的程式,對資料的交易處理是必不可少的。下面就一些交易處理的問題談一下我的看法。

什麼叫事務,這裡我就不祥述了,感興趣的朋友可以自己看一下sql server的book online或是msdn。我舉一個淺顯的例子吧,比如說你要把一個form中的資料同時向兩個相關聯的表中插入,如果不使用事務,那就可能出現這用情況,第一個表中成功更新後,突然資料庫出現意外狀況,第二個表的操作沒有完成,這樣的話有什麼結果也就不用說了。要避免這種情況,就應該使用事務,它的作用就是要不兩個表都操作成功,要不都失敗,換句話說,就是保持資料的一致性。具體做法是這樣,在begin trans之後的所有操作只有到commit trans的時候才真正執行,如果其中有一部分操作失敗,那麼就用rollback trans恢複整個事務,是資料保持所有操作進行以前的狀態。但這裡需要注意的一個問題是,如果有一部分操作失敗,但不是致命錯誤,那麼資料庫不會停在那兒,而是繼續下一條操作,直到執行到commit trans , 系統會執行那些已經成功的操作,這也就是為什麼有些程式儘管用了事務但還是出現只有部分資料被更新的情況,而不是預想的能夠保持資料的一致性。所以正確的做法應該是在每一個對資料的操作後,都應該檢查一下@@error的值,如果出錯則轉向錯誤處理部分,該部分負責執行rollback trans ,恢複整個事務。

看下面兩個表,這是一個bbs的註冊使用者表以及它的相關表。

if exists(select * from sysobjects where ID = object_id("BBSUser"))
drop table BBSUser
go

create table BBSUser
(
ID int Primary key identity not null ,
UserName varchar(20) default "" not null ,
Password varchar(10) default "" not null ,
UserType tinyint default 0 not null , --使用者類型,1為斑竹
Email varchar(100) default "" not null ,
HomePage varchar(100) default "" not null ,
ICQ varchar(20) default "" not null ,
Signature varchar(255) default "" not null , --簽名
Point int default 0 not null , --使用者積分
)
go

if exists(select * from sysobjects where ID = object_id("BBSUserAction"))
drop table BBSUserAction
go

create table BBSUserAction
(
id int Primary key identity not null ,
UserID int default 0 not null , --使用者ID
SignTime datetime default getdate() not null , --登入時間
IP varchar(15) default "" not null , --登入IP
)
go

下面這個預存程序要完成這樣一個任務,就是使用者在註冊完後把資料插入這兩個表,並且第二表中的UserID的值是插入第一個表中的自動增加型欄位ID,這裡就用到一個技巧,用到了系統變數@@identity,它的值就是最後一次插入操作中的identity型欄位的值。這個預存程序中就用到了事務,請仔細看一下代碼吧,我就不多說了。
if exists (select * from sysobjects where ID = object_id("up_RegisterUser"))
drop proc up_RegisterUser
go

create proc up_RegisterUser
@a_strUserName varchar(20) , @a_strPassword varchar(10) , @a_strEmail varchar(100) ,
@a_strHomepage varchar(100) , @a_strICQ varchar(20) , @a_strSignature varchar(255) ,
@a_strIP varchar(15)
as
declare @m_strUserID int

/*因為要對兩個表進行操作,所以放到事務當中*/
begin tran --事務開始
insert into BBSUser values --更新BBSUser表
(
@a_strUserName , @a_strPassword , 0 , @a_strEmail ,
@a_strHomepage , @a_strICQ , @a_strSignature , 0
)
if (@@error <> 0) goto On_Error --如果操作失敗,轉向錯誤處理
select @m_strUserID = @@identity --儲存剛插入的ID號

insert into BBSUserAction values --更新BBSUserAction表
(
@m_strUserID , getdate() , @a_strIP
)
if (@@error <> 0) goto On_Error --如果操作失敗,轉向錯誤處理

commit tran --事務結束
return (0) --返回成功碼

On_Error: --錯誤處理
rollback tran --恢複事務
return (-1) --返回錯誤碼
go

 



相關文章

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 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。