数据库数据一致性——事务和存储过程


问题背景:

  原先做机房收费系统的时候,对于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  where CardID=@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层的接口,这也是其一个作用吧~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值