《轉》SQL server事務的兩種用法()

2022-05-03 19:00:07 字數 3160 閱讀 9645

事務(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)

sqlconnection con =new sqlconnection(@"data source=.\sqlexpress;database=aaaa;uid=sa;pwd=jcx"); //連線字串

sqlcommand cmd = new sqlcommand("mon",con); //呼叫儲存過程

cmd.commandtype = commandtype.storedprocedure;

con.open();

sqlparameter prar = new sqlparameter();//傳遞引數

cmd.parameters.addwithvalue("@fromid", 1);

cmd.parameters.addwithvalue("@toid", 2);

cmd.parameters.addwithvalue("@momeys",convert.toint32( textbox1.text) );

cmd.parameters.add("@return", "").direction = parameterdirection.returnvalue;//獲取儲存過程的返回值

cmd.executenonquery();

string value = cmd.parameters["@return"].value.tostring();//把返回值賦值給value

if (value == "1")

label1.text = "新增成功";

else

label1.text = "新增失敗";

這個也就是在儲存過程裡新增事務,再來看看不在資料庫寫sql儲存過程,ado.net是如何處理事務的:

protected void button2_click(object sender, eventargs e)

sqlconnection con = new sqlconnection(@"data source=.\sqlexpress;database=aaaa;uid=sa;pwd=jcx");

con.open();

sqltransaction tran = con.begintransaction();//先例項sqltransaction類,使用這個事務使用的是con 這個連線,使用begintransaction這個方法來開始執行這個事務

sqlcommand cmd = new sqlcommand();

cmd.connection = con;

cmd.transaction = tran;

try//在try{} 塊裡執行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

label1.text = "新增失敗";

tran.rollback();//如何執行不成功,發生異常,則執行rollback方法,回滾到事務操作開始之前;

這就是兩個事務不同用法的簡單例子,ado.net 事務處理的方法看起來比較簡單,但是他要使用同乙個連線來執行這些操作,要是同時使用幾個資料庫來用乙個事務執行,這樣就比較繁瑣,但是要是用sql儲存過程,這樣就相對比較簡單,總之是兩種方法各有各的優點。

Sql server 事務的兩種用法

事務 transaction 是併發控制的單位,是使用者定義的乙個操作序列。這些操作要麼都做,要麼都不做,是乙個不可分割的工作單位。通過事務,sql server 能將邏輯相關的一組操作繫結在一起,以便伺服器保持資料的完整性。在 sql server net 開發環境下,有兩種方法能夠完成事務的操作...

Sql server 事務的兩種用法

事務 transaction 是併發控制的單位,是使用者定義的乙個操作序列。這些操作要麼都做,要麼都不做,是乙個不可分割的工作單位。通過事務,sql server 能將邏輯相關的一組操作繫結在一起,以便伺服器保持資料的完整性。在 sql server net 開發環境下,有兩種方法能夠完成事務的操作...

SQLserver 事務的兩種用法

事務 transaction 是併發控制的單位,是使用者定義的乙個操作序列。這些操作要麼都做,要麼都不做,是乙個不可分割的工作單位。通過事務,sql server 能將邏輯相關的一組操作繫結在一起,以便伺服器保持資料的完整性。在 sql server net 開發環境下,有兩種方法能夠完成事務的操作...