小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

SQL 事務(wù)的兩種用法

 悟靜 2012-06-14
 一。事物:
     1.事物是一種機(jī)制,它包含了一組數(shù)據(jù)庫的操作命令,并且所有的命令作為一個(gè)整體執(zhí)行,在內(nèi)存中執(zhí)行,停在內(nèi)存的臨時(shí)表中,沒             有去執(zhí)行數(shù)據(jù)庫的操作。      事物僅對(duì)增、刪、改操作起作用,對(duì)查詢操作沒有意義。                 事物有四個(gè)屬性:原子性(事物是一個(gè)完整的操作)            一致性(事物開始和結(jié)束,數(shù)據(jù)要恢復(fù)到開始時(shí)的一致狀態(tài))                 隔離性(事物的獨(dú)立性,事物之間的操作是相互獨(dú)立的)             持久性(事物完成后對(duì)數(shù)據(jù)庫的影響是持久的)        2.開始事物:begin transaction   --指定事物從此開始,后面的數(shù)據(jù)庫操作是一個(gè)整體               提交事物:commit transaction                回滾事物:rollback transaction
事務(wù)(Transaction)是并發(fā)控制的單位,是用戶定義的一個(gè)操作序列。這些操作要么都做,要么都不做,是一個(gè)不可分割的工作單位。
通過事務(wù),SQL Server能將邏輯相關(guān)的一組操作綁定在一起,以便服務(wù)器保持?jǐn)?shù)據(jù)的完整性。
sql server+ .net 開發(fā)環(huán)境下,有兩種方法能夠完成事務(wù)的操作,保持?jǐn)?shù)據(jù)庫的數(shù)據(jù)完整性;
一個(gè)就是用sql存儲(chǔ)過程,另一個(gè)就是在ADO.NET中一種簡單的事務(wù)處理;
現(xiàn)在通過一個(gè)典型的銀行轉(zhuǎn)賬的例子來說明一下這兩個(gè)例子的用法
我們先來看看sql存儲(chǔ)過程是如何來完成事務(wù)的操作的:
首先創(chuàng)建一個(gè)表:
create database aaaa --創(chuàng)建一個(gè)表,包含用戶的賬號(hào)和錢數(shù)
go
use aaaa
create table bb
(
 ID int not null primary key,  --賬號(hào)
 moneys money    --轉(zhuǎn)賬金額
insert into bb values ('1','2000') --插入兩條數(shù)據(jù)
insert into bb values ('2','3000')

用這個(gè)表創(chuàng)建一個(gè)存儲(chǔ)過程:

create procedure mon --創(chuàng)建存儲(chǔ)過程,定義幾個(gè)變量

@toID int,    --接收轉(zhuǎn)賬的賬戶

@fromID int ,  --轉(zhuǎn)出自己的賬戶

@momeys money --轉(zhuǎn)賬的金額

as

begin tran --開始執(zhí)行事務(wù)

 

update bb set moneys=moneys-@momeys where ID=@fromID -執(zhí)行的第一個(gè)操作,轉(zhuǎn)賬出錢,減去轉(zhuǎn)出的金額

update bb set moneys=moneys+@momeys where ID=@toID --執(zhí)行第二個(gè)操作,接受轉(zhuǎn)賬的金額,增加

 

if @@error<>0 --判斷如果兩條語句有任何一條出現(xiàn)錯(cuò)誤

begin rollback tran –開始執(zhí)行事務(wù)的回滾,恢復(fù)的轉(zhuǎn)賬開始之前狀態(tài)

return 0

end

go

 

else   --如何兩條都執(zhí)行成功

begin commit tran 執(zhí)行這個(gè)事務(wù)的操作

return 1

end

go

 

接下來看看C#.net 是如何調(diào)用這個(gè)存儲(chǔ)過程的:

    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); //調(diào)用存儲(chǔ)過程

        cmd.CommandType = CommandType.StoredProcedure;

        con.Open();

        SqlParameter prar = new SqlParameter();//傳遞參數(shù)

        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;//獲取存儲(chǔ)過程的返回值

        cmd.ExecuteNonQuery();

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

        if (value == "1")

        {

            Label1.Text = "添加成功";

        }

        else

        {

            Label1.Text = "添加失敗";

       }

}

這個(gè)也就是在存儲(chǔ)過程里添加事務(wù),再來看看不在數(shù)據(jù)庫寫sql存儲(chǔ)過程,ADO.NET是如何處理事務(wù)的:

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();//先實(shí)例SqlTransaction類,使用這個(gè)事務(wù)使用的是con這個(gè)連接,使用BeginTransaction這個(gè)方法來開始執(zhí)行這個(gè)事務(wù)

        SqlCommand cmd = new SqlCommand();

        cmd.Connection = con;

        cmd.Transaction = tran;

        try

        {

             //try{}塊里執(zhí)行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();//如果兩個(gè)sql命令都執(zhí)行成功,則執(zhí)行commit這個(gè)方法,執(zhí)行這些操作

 

            Label1.Text = "添加成功";

        }

        catch

        {

            Label1.Text = "添加失敗";

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

        }

 

    }

這就是兩個(gè)事務(wù)不同用法的簡單例子,ADO.NET事務(wù)處理的方法看起來比較簡單,但是他要使用同一個(gè)連接來執(zhí)行這些操作,要是同時(shí)使用幾個(gè)數(shù)據(jù)庫來用一個(gè)事務(wù)執(zhí)行,這樣就比較繁瑣,但是要是用sql存儲(chǔ)過程,這樣就相對(duì)比較簡單,總之是兩種方法各有各的優(yōu)點(diǎn)。


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多