成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

關(guān)系數(shù)據(jù)庫SQL之可編程性事務(wù)

skinner / 3317人閱讀

摘要:前言前面關(guān)系數(shù)據(jù)庫之可編程性函數(shù)用戶自定義函數(shù)一文提到關(guān)系型數(shù)據(jù)庫提供了可編程性的函數(shù)存儲(chǔ)過程事務(wù)觸發(fā)器及游標(biāo),前文已介紹了函數(shù)存儲(chǔ)過程,本文來介紹一下事務(wù)的使用。在相關(guān)數(shù)據(jù)庫中,所有規(guī)則都必須應(yīng)用于事務(wù)的修改,以保持所有數(shù)據(jù)的完整性。

前言

前面關(guān)系數(shù)據(jù)庫SQL之可編程性函數(shù)(用戶自定義函數(shù))一文提到關(guān)系型數(shù)據(jù)庫提供了可編程性的函數(shù)、存儲(chǔ)過程、事務(wù)、觸發(fā)器及游標(biāo),前文已介紹了函數(shù)、存儲(chǔ)過程,本文來介紹一下事務(wù)的使用。(還是以前面的銀行系統(tǒng)為例)

概述

是指作為單個(gè)邏輯工作單元執(zhí)行的一系列操作,要么完全地執(zhí)行,要么完全地不執(zhí)行。
一個(gè)邏輯工作單元要成為事務(wù),必須滿足所謂的ACID(原子性、一致性、隔離性和持久性)特性。

語法

開始事務(wù):事務(wù)開始的位置,就是單個(gè)邏輯工作單元的開始。
回滾事務(wù):就是將數(shù)據(jù)恢復(fù)至事務(wù)開始的狀態(tài),一般是不滿足條件或者是發(fā)生錯(cuò)誤的時(shí)候執(zhí)行該操作。
提交事務(wù):事務(wù)結(jié)束的位置,就是單個(gè)邏輯工作單元成功執(zhí)行后,改變數(shù)據(jù)狀態(tài)。

--開始事務(wù)
BEGIN TRAN[SACTION]
--回滾事務(wù),TRAN[SACTION]可省略
ROLLBACK TRAN[SACTION]
--提交事務(wù)
COMMIT TRAN[SACTION]

--事務(wù)使用
BEGIN TRAN[SACTION]
--這里是SQL語句塊

上面的SQL語句塊,需要在適當(dāng)?shù)奈恢眉由?b>COMMIT TRAN[SACTION],如果需要回滾可以有ROLLBACK TRAN[SACTION]。

事務(wù)可以與存儲(chǔ)過程聯(lián)合使用。

特性

原子性(Atomic)(Atomicity)

事務(wù)必須是原子工作單元;對(duì)于其數(shù)據(jù)修改,要么全都執(zhí)行,要么全都不執(zhí)行。通常,與某個(gè)事務(wù)關(guān)聯(lián)的操作具有共同的目標(biāo),并且是相互依賴的。如果系統(tǒng)只執(zhí)行這些操作的一個(gè)子集,則可能會(huì)破壞事務(wù)的總體目標(biāo)。原子性消除了系統(tǒng)處理操作子集的可能性。

一致性(Consistent)(Consistency)

事務(wù)在完成時(shí),必須使所有的數(shù)據(jù)都保持一致狀態(tài)。在相關(guān)數(shù)據(jù)庫中,所有規(guī)則都必須應(yīng)用于事務(wù)的修改,以保持所有數(shù)據(jù)的完整性。事務(wù)結(jié)束時(shí),所有的內(nèi)部數(shù)據(jù)結(jié)構(gòu)(如 B 樹索引或雙向鏈表)都必須是正確的。某些維護(hù)一致性的責(zé)任由應(yīng)用程序開發(fā)人員承擔(dān),他們必須確保應(yīng)用程序已強(qiáng)制所有已知的完整性約束。例如,當(dāng)開發(fā)用于轉(zhuǎn)帳的應(yīng)用程序時(shí),應(yīng)避免在轉(zhuǎn)帳過程中任意移動(dòng)小數(shù)點(diǎn)。

隔離性(Insulation)(Isolation)

由并發(fā)事務(wù)所作的修改必須與任何其它并發(fā)事務(wù)所作的修改隔離。事務(wù)查看數(shù)據(jù)時(shí)數(shù)據(jù)所處的狀態(tài),要么是另一并發(fā)事務(wù)修改它之前的狀態(tài),要么是另一事務(wù)修改它之后的狀態(tài),事務(wù)不會(huì)查看中間狀態(tài)的數(shù)據(jù)。這稱為隔離性,因?yàn)樗軌蛑匦卵b載起始數(shù)據(jù),并且重播一系列事務(wù),以使數(shù)據(jù)結(jié)束時(shí)的狀態(tài)與原始事務(wù)執(zhí)行的狀態(tài)相同。當(dāng)事務(wù)可序列化時(shí)將獲得最高的隔離級(jí)別。在此級(jí)別上,從一組可并行執(zhí)行的事務(wù)獲得的結(jié)果與通過連續(xù)運(yùn)行每個(gè)事務(wù)所獲得的結(jié)果相同。由于高度隔離會(huì)限制可并行執(zhí)行的事務(wù)數(shù),所以一些應(yīng)用程序降低隔離級(jí)別以換取更大的吞吐量。

持久性(Duration)(Durability)

事務(wù)完成之后,它對(duì)于系統(tǒng)的影響是永久性的。該修改即使出現(xiàn)致命的系統(tǒng)故障也將一直保持。

示例

創(chuàng)建一個(gè)帶事務(wù)的存儲(chǔ)過程:孫悟空要取錢,交易信息表里面插入交易信息,同時(shí)要更改賬戶表里面的余額

begin transaction
    if exists(select * from sysobjects where name = "proc_getMoney")
    drop procedure proc_getMoney
    go
    create proc proc_getMoney
        @cardId varchar(19),
        @tranMoney money
    as
    declare @balance money
    select @balance = LeftMoney from CardInfo where CardID = @cardId
    if(@tranMoney <= @balance)
    begin
        insert into TransInfo values(@cardId,"取款",@tranMoney,default)
        if(@@ERROR=0)
        begin
            update CardInfo set LeftMoney = LeftMoney - @tranMoney where CardID = @cardId
            if(@@ERROR=0)
            begin
                commit transaction
                print "OK"    
            end    
        end
        else
        begin
            rollback
            print "error"
        end
    end
    else
            print "余額不足"
go
exec proc_getMoney "1324 3626 7532 1935",520
go
exec proc_getMoney "1027 3526 1536 1135",520
go

在存儲(chǔ)過程內(nèi)創(chuàng)建事務(wù),根據(jù)用戶輸入的個(gè)人信息,實(shí)現(xiàn)銀行卡開戶,輸出參數(shù)作為用戶的銀行卡卡號(hào)以及銀行卡余額(開戶時(shí)不僅要在用戶信息表和銀行卡表添加一條數(shù)據(jù),也要在交易信息表中插入一條存款的記錄,因?yàn)殚_卡時(shí)需要指定開卡金額,銀行卡卡號(hào)自動(dòng)生成)

if exists(select * from sysobjects where name = "proc_openAccount")
drop procedure proc_openAccount
go
create proc proc_openAccount
    @CustName varchar(20),        --定義變量開戶人姓名
    @IDCard varchar(18),        --定義變量開戶人身份證號(hào)
    @TelePhone varchar(13),        --定義變量開戶人電話號(hào)碼
    @Address varchar(50),        --定義變量開戶人住址
    @openMoney money            --定義變量開戶存入現(xiàn)金金額
as
begin
begin transaction
    declare @CustID int,@CardID varchar(19)     --定義變量開戶人的賬戶編號(hào),開戶的卡號(hào)
    exec proc_getCardNo  @CardID output --執(zhí)行自動(dòng)生成卡號(hào)的存儲(chǔ)過程,將輸出值賦給變量@CardID
        --向賬戶表中插入數(shù)據(jù)
        insert into AccountInfo values
        (@CustName,@IDCard,@TelePhone,@Address)
    if(@@error != 0)--如果出錯(cuò)
        rollback--事務(wù)回滾
    else
        begin
            set @CustID = @@identity     --獲取生成賬戶的編號(hào)CustID
            --向銀行卡表中插入數(shù)據(jù)
            insert into CardInfo values
            (@CardID,default,@CustID,"活期",getdate(),@openMoney,@openMoney,"否")
                if(@@error != 0)
                    rollback
                else
                    begin
                    --向交易表中插入數(shù)據(jù)
                    insert into TransInfo values
                    (@CardID,"存款",@openMoney,default)
                    if(@@error != 0)
                        begin
                            rollback
                            print "開戶失敗,插入數(shù)據(jù)錯(cuò)誤!"
                        end
                    else
                        begin
                            print "開戶成功!"
                            print "卡號(hào)為:" + @CardID
                        end
                    end
        end
commit transaction
end
go
exec proc_openAccount "八戒","422322001550135015","027-8658888","高老莊",250
go

附:
實(shí)現(xiàn)生產(chǎn)銀行卡的存儲(chǔ)過程,該存儲(chǔ)過程能隨機(jī)的產(chǎn)生一個(gè)卡號(hào)輸出

if exists(select * from sysobjects where name = "proc_getCardNo")
    drop procedure proc_getCardNo
    go
    create proc proc_getCardNo
        @CardNo varchar(19) output    --定義輸出參數(shù)的類型
    as
    begin
        declare @day varchar(2) --定義日期
        set @day = dateName(dd,getdate())
        if @day<10    --如果日期小于10,要對(duì)其加"0"
        set @day = "0"+@day
        set @CardNo = convert(varchar(9),(dateName(yyyy,getdate())+" "
+ dateName(mm,getdate())))+@day+" "+ convert(varchar(10),(dateName(hh,getdate())
+dateName(mi,getdate())+" "+ subString(convert(varchar(6),rand(datepart(ms,getdate()))*1000000),1,5)))    
    end
go
declare @card varchar(19)
exec proc_getCardNo  @card output
print "卡號(hào)為:" + @card
go

本文就介紹到這里。
如有疑問請(qǐng)聯(lián)系我。

原文來自:簡書

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/17538.html

相關(guān)文章

  • 關(guān)系數(shù)據(jù)庫SQL編程觸發(fā)器

    摘要:前言前面關(guān)系數(shù)據(jù)庫之可編程性函數(shù)用戶自定義函數(shù)一文提到關(guān)系型數(shù)據(jù)庫提供了可編程性的函數(shù)存儲(chǔ)過程事務(wù)觸發(fā)器及游標(biāo),前文已介紹了函數(shù)存儲(chǔ)過程事務(wù),本文來介紹一下觸發(fā)器的使用。觸發(fā)器是在執(zhí)行之后觸發(fā),而觸發(fā)器是在執(zhí)行之前觸發(fā)。 前言 前面關(guān)系數(shù)據(jù)庫SQL之可編程性函數(shù)(用戶自定義函數(shù))一文提到關(guān)系型數(shù)據(jù)庫提供了可編程性的函數(shù)、存儲(chǔ)過程、事務(wù)、觸發(fā)器及游標(biāo),前文已介紹了函數(shù)、存儲(chǔ)過程、事務(wù),本...

    LiangJ 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

skinner

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<