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

发表于:2013-8-21 10:01

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:zllaptx4869    来源:51Testing软件测试网采编

  问题背景:

  原先做机房收费系统的时候,对于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

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号