<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    qileilove

    blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問 http://qaseven.github.io/

    數(shù)據(jù)庫(kù)數(shù)據(jù)一致性——事務(wù)和存儲(chǔ)過程

     問題背景:

      原先做機(jī)房收費(fèi)系統(tǒng)的時(shí)候,對(duì)于D層訪問數(shù)據(jù)庫(kù),對(duì)數(shù)據(jù)庫(kù)的操作基本上都是通過SQL語(yǔ)句實(shí)現(xiàn)的,這樣導(dǎo)致的一個(gè)問題就是在完成機(jī)房收費(fèi)系統(tǒng)中,產(chǎn)生了一些容易被忽略的邏輯黑洞。例如:在退卡業(yè)務(wù)邏輯中,要判斷從注冊(cè)表中是否刪除成功,其次,還要判斷是否將退卡記錄添加到退卡記錄表中,兩者都成功之后,標(biāo)識(shí)退卡業(yè)務(wù)邏輯完成,任何一個(gè)失敗,退卡業(yè)務(wù)邏輯標(biāo)識(shí)失敗。我原先的思路有點(diǎn)片面化,就是通過and連接符來(lái)判斷兩者是否都為true:

    If ICancelcard.AddCancelCard(EntityCancelCard) = True And IStuInfo.DeleteStudent(EntityCancelCard) = True Then
    Return True
    Else
    Return False
    End If

      但是這樣就出現(xiàn)了一個(gè)思維漏洞:假設(shè)一種情況——從卡的注冊(cè)表中刪除成功了,但是添加信息的時(shí)候卻添加失敗了,按照上述代碼,則會(huì)給用戶提示:用戶退卡失敗。但是這時(shí)候卻已經(jīng)從卡的注冊(cè)表中刪除的情況;

      解決方式(一):——存儲(chǔ)過程

      存儲(chǔ)過程:

      是一組為了完成特定功能的SQL 語(yǔ)句集,經(jīng)編譯后存儲(chǔ)在數(shù)據(jù)庫(kù)中,用戶通過指定存儲(chǔ)過程的名字并給出參數(shù)(如果該存儲(chǔ)過程帶有參數(shù))來(lái)執(zhí)行它。對(duì)于上述的問題,用存儲(chǔ)過程來(lái)解決:當(dāng)從卡注冊(cè)表中刪除某個(gè)卡的時(shí)候,將卡的信息添加到退卡記錄表中:

    CREATEPROCEDURE Pro_CancelCard
                @StudentIDchar(10),
    @CardIDint,
    @CancelCashnumeric(18,2),
    @Datechar(20),
    @TimeChar(20),
    @UserIDChar(10),
    @StatusChar(10),       
     
    AS
    BEGIN
      deletefrom TB_Student_Info  whereCardID=@CardID
     SETNOCOUNT ON;
           insert TB_CancelCard_Infovalues(@StudentID,@CardID,@CancelCash,@Date,@Time,@UserID,@Status)
        END
    GO


     解決方式(二):——事務(wù)結(jié)合存儲(chǔ)過程

      事務(wù):

      是指作為單個(gè)邏輯工作單元執(zhí)行的一系列操作。事務(wù)處理可以確保除非事務(wù)性單元內(nèi)的所有操作都成功完成,否則不會(huì)永久更新面向數(shù)據(jù)的資源。用我們通俗的理解,就是武俠小說(shuō)中的:不成功,便成仁!要不都成功,要不都不成功。其最重要的特征就是一致性,也可以理解為原子性

    Create procedure [dbo].[PROC_UpStuCash]    
     @StudentID char(10),
     @CardID int,
     @CancelCash numeric(18,2),
     @Date char(20),
     @Time Char(20),
     @UserID Char(10),
     @Status Char(10), 
    as 
    begin 
     set nocount on;
     set xact_abort on ;
      
      /開始事務(wù)
     begin tran 
      delete from TB_Student_Info  where CardID =@CardID 
      insert TB_CancelCard_Info values(@StudentID,@CardID,@CancelCash,@Date,@Time,@UserID,@Status)
     if @@ERROR = 0
      commit tran /都執(zhí)行成功,提交事務(wù)
     else
             rollback tran /任何一個(gè)失敗,事務(wù)回滾

    end

      在D層的實(shí)現(xiàn):

    ''' 刪除注冊(cè)用戶學(xué)生
        '''</summary>
        ''' <param name="Student"></param>
        ''' <returns>Boolean</returns>
        ''' <remarks>如果刪除成功,返回ture 否則返回false</remarks>
        Public Function DeleteStudent(Student As CancelCardEntity) As Boolean Implements IStudentInfo.DeleteStudent
            Dim paras As SqlParameter()
            Try
                paras = New SqlParameter() {
                         New SqlParameter("@CardID", Student.CancelCardID),
                         New SqlParameter("@StudentID", Student.CancelStuID),
                         New SqlParameter("@CancelCash", Student.CancelCash),
                         New SqlParameter("@Date", Student.CancelDate),
                         New SqlParameter("@Time", Student.CancelTime),
                         New SqlParameter("@UserID", Student.CancelUserID),
                         New SqlParameter("@Status", "結(jié)賬")
                         }

                sqlStr = "Pro_CancelCard"

                Return SqlHelperDAL.Instance.ExecAddDelUpdate(sqlStr, CommandType.StoredProcedure, paras)

            Catch ex As Exception
                Throw ex
            End Try
        End Function

      小結(jié):

      對(duì)于數(shù)據(jù)庫(kù)完整性,由原先的一無(wú)所知,到初步了解,以及到現(xiàn)在的慢慢的使用,這是一個(gè)慢慢的過程;當(dāng)然,事務(wù)的使用也不是那么的熟練和完美,對(duì)于筆記中的擴(kuò)展事務(wù)控制,傳統(tǒng)的事務(wù)控制,復(fù)制控制等,現(xiàn)在還是停留在認(rèn)知階段。其實(shí),對(duì)于事務(wù)和存儲(chǔ)過程,如果寫的足夠完美的話,完全可以將復(fù)雜的業(yè)務(wù)邏輯層給簡(jiǎn)化,在D層執(zhí)行對(duì)應(yīng)的存儲(chǔ)過程,讓B層簡(jiǎn)單實(shí)現(xiàn)D層的接口,這也是其一個(gè)作用吧~~~

    posted on 2013-08-22 10:59 順其自然EVO 閱讀(316) 評(píng)論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫(kù)

    <2013年8月>
    28293031123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿(55)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲?V无码乱码国产精品| 日韩精品无码专区免费播放| 国产亚洲大尺度无码无码专线| 成人无码区免费A片视频WWW| 中文在线观看免费网站| 日韩欧美亚洲中文乱码| 亚洲一区二区三区免费观看| 亚洲精品无码久久久久去q| 免费一级毛片清高播放| 性一交一乱一视频免费看| 在线看片免费人成视久网| 国产中文字幕在线免费观看| 麻豆69堂免费视频| 亚洲日韩国产欧美一区二区三区 | 精品久久久久久亚洲| 亚洲国产成人VA在线观看 | 亚洲色在线无码国产精品不卡| 亚洲综合精品香蕉久久网97| 亚洲精品无码专区久久久| 中文字幕精品无码亚洲字| 亚洲A∨午夜成人片精品网站| 精品国产免费观看久久久| 女人18毛片a级毛片免费视频| 99久久这里只精品国产免费| 亚洲免费视频播放| 99re热精品视频国产免费| 日本在线看片免费人成视频1000 | 精品久久久久久亚洲| 亚洲夜夜欢A∨一区二区三区| 国产日产亚洲系列最新| 亚洲片一区二区三区| 亚洲中文无韩国r级电影| 精品亚洲成α人无码成α在线观看| 亚洲第一永久AV网站久久精品男人的天堂AV | 一级做a爰片久久毛片免费陪| 香蕉视频免费在线播放| 尤物视频在线免费观看| 国产免费高清69式视频在线观看| 免费在线观看一区| aaa毛片免费观看| 久久精品免费一区二区三区|