事務(transaction
)是併發控制的單位,是使用者定義的乙個操作序列。這些操作要麼都做,要麼都不做,是乙個不可分割的工作單位。
通過事務,sql server
能將邏輯相關的一組操作繫結在一起,以便伺服器保持資料的完整性。
在sql server+ .net
開發環境下,有兩種方法能夠完成事務的操作,保持資料庫的資料完整性;
乙個就是用sql儲存過程,另乙個就是在
ado.net
中一種簡單的事務處理;
現在通過乙個典型的銀行轉賬的例子來說明一下這兩個例子的用法
我們先來看看sql儲存過程是如何來完成事務的操作的:
首先建立乙個表:
create database aaaa --建立乙個表,包含使用者的帳號和錢數
go
use aaaa
create table bb
(
id int not null primary key, --帳號
moneys money --轉賬金額
)
insert into bb values ('1','2000') --插入兩條資料
insert into bb values ('2','3000')用這個表建立乙個儲存過程:
create procedure mon --建立儲存過程,定義幾個變數
@toid int,--
接收轉賬的賬戶
@fromid int , --轉出自己的賬戶
@momeys money --轉賬的金額
asbegin tran --開始執行事務
update bb set moneys=moneys-@momeys where id=@fromid -執行的第乙個操作,轉賬出錢,減去轉出的金額
update bb set moneys=moneys+@momeys where id=@toid --執行第二個操作,接受轉賬的金額,增加
if @@error<>0 --判斷如果兩條語句有任何一條出現錯誤
begin rollback tran –開始執行事務的回滾,恢復的轉賬開始之前狀態
return 0
endgo
else --
如何兩條都執行成功
begin commit tran 執行這個事務的操作
return 1
endgo
接下來看看c#.net 是如何呼叫這個儲存過程的:
protected void button1_click(object sender, eventargs e)
else
}這個也就是在儲存過程裡新增事務,再來看看不在資料庫寫sql儲存過程,ado.net是如何處理事務的:
protected void button2_click(object sender, eventargs e)
塊裡執行sqlcommand命令,
cmd.commandtext = "update bb set moneys=moneys-'" + convert.toint32(textbox1.text) + "' where id='1'";
cmd.executenonquery();
cmd.commandtext = "update bb set moneys=moneys+' aa ' where id='2'";
cmd.executenonquery();
tran.commit();//
如果兩個sql命令都執行成功,則執行commit這個方法,執行這些操作
label1.text = "
新增成功";
}catch
}這就是兩個事務不同用法的簡單例子,ado.net 事務處理的方法看起來比較簡單,但是他要使用同乙個連線來執行這些操作,要是同時使用幾個資料庫來用乙個事務執行,這樣就比較繁瑣,但是要是用sql儲存過程,這樣就相對比較簡單,總之是兩種方法各有各的優點。
FIELD SYMBOLS的兩種用法
第一種,把fs當做乙個泛型,什麼東西都可以放進去 data begin of man,name type str,20 type c,height type i,end of man.data a man like man.a man name 阿勇 a man f a man height 171...
Android Intent的兩種用法
intent是android元件之一,是用於連線四大元件的乙個比較重要的部分。intent有兩種用法 一種是顯式intent,如果用於啟用activity就這樣寫 intent intent new intent this,testactivity.class startactivity 一種是隱式...
Handler的兩種用法
android 為了執行緒安全,只允許在主線程中修改ui,如果想在子執行緒中更改ui,可以使用handler.用法一 在子執行緒中傳送更新資訊 message msg message.obtain msg.what 1 bundle data new bundle data.putstring so...