qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          數據庫數據一致性——事務和存儲過程

           問題背景:

            原先做機房收費系統的時候,對于D層訪問數據庫,對數據庫的操作基本上都是通過SQL語句實現的,這樣導致的一個問題就是在完成機房收費系統中,產生了一些容易被忽略的邏輯黑洞。例如:在退卡業務邏輯中,要判斷從注冊表中是否刪除成功,其次,還要判斷是否將退卡記錄添加到退卡記錄表中,兩者都成功之后,標識退卡業務邏輯完成,任何一個失敗,退卡業務邏輯標識失敗。我原先的思路有點片面化,就是通過and連接符來判斷兩者是否都為true:

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

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

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

            存儲過程:

            是一組為了完成特定功能的SQL 語句集,經編譯后存儲在數據庫中,用戶通過指定存儲過程的名字并給出參數(如果該存儲過程帶有參數)來執行它。對于上述的問題,用存儲過程來解決:當從卡注冊表中刪除某個卡的時候,將卡的信息添加到退卡記錄表中:

          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


           解決方式(二):——事務結合存儲過程

            事務:

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

          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 ;
            
            /開始事務
           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 /都執行成功,提交事務
           else
                   rollback tran /任何一個失敗,事務回滾

          end

            在D層的實現:

          ''' 刪除注冊用戶學生
              '''</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", "結賬")
                               }

                      sqlStr = "Pro_CancelCard"

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

                  Catch ex As Exception
                      Throw ex
                  End Try
              End Function

            小結:

            對于數據庫完整性,由原先的一無所知,到初步了解,以及到現在的慢慢的使用,這是一個慢慢的過程;當然,事務的使用也不是那么的熟練和完美,對于筆記中的擴展事務控制,傳統的事務控制,復制控制等,現在還是停留在認知階段。其實,對于事務和存儲過程,如果寫的足夠完美的話,完全可以將復雜的業務邏輯層給簡化,在D層執行對應的存儲過程,讓B層簡單實現D層的接口,這也是其一個作用吧~~~

          posted on 2013-08-22 10:59 順其自然EVO 閱讀(318) 評論(0)  編輯  收藏 所屬分類: 數據庫

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

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 河间市| 文山县| 兴业县| 东乡族自治县| 西青区| 玛曲县| 鹿邑县| 沙田区| 南平市| 德江县| 溧水县| 焦作市| 札达县| 军事| 古田县| 永修县| 赣州市| 长岭县| 天气| 保亭| 托克逊县| 浮梁县| 唐山市| 富顺县| 德州市| 商都县| 杂多县| 武胜县| 兴安盟| 平南县| 五常市| 衡南县| 新竹县| 博爱县| 商南县| 新乐市| 黑河市| 新化县| 隆昌县| 兴仁县| 邛崃市|