重构——注册——存储过程+事务

来源:互联网 发布:seo常用的工具 编辑:程序博客网 时间:2024/05/29 02:45

    重构做到注册的时候遇到了点困难,简单的分析一下需求:

    


    通过图可以看出,为了解耦,我将卡与学生分成了两张表,并且,卡表与学生表之间有外键约束关系,也就是说,必须先将学生信息填到T_Student表中,才能注册卡,在卡表中添加信息,还有就是需要将注册卡时的初始金额放到充值表中去。也就是说注册的需求就是添加学生表、添加卡表、添加充值表。需要同时对三张表进行操作,执行多条SQL语句,这时候就要用到存储过程了。


    首先我们来看一下什么是存储过程?

定义:用SQL语句和流程控制语句编写的模块。

                优点:提高运行速度。

                            增强了SQL的功能和灵活性

                            降低网络的通信量

                            减轻了程序编写的工作量

                            间接实现安全控制功能

                存储位置:以数据库对象的形式存储在数据库中。


    了解了存储过程的定义我们先去数据库中建立一个存储过程。

             重构数据库——可编程性——存储过程——(右击)新建存储过程

             数据库会自动给你生成一个存储过程的模板。


     刚才我们也分析过了,对这三张表的操作要么都执行,要么都不执行,大家是不是想到了什么——事务。咱们想到的正是事务的原子性。


           问题又来了,什么是事务?

           定义:构成单一逻辑工作单元的操作集合,要么完整的执行,要么不执行。

           作用:保证数据库中数据总是正确的。

           性质:原子性、一致性、隔离性、持久性。


    查阅了一些资料,我发现事务是可以加在存储过程中的,于是关于注册的存储过程就这么诞生了。

    

<span style="font-size:18px;"><strong>USE [chonggou]GO/****** Object:  StoredProcedure [dbo].[PEOC_Register]    Script Date: 01/31/2016 17:39:01 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Author:<郑涛>-- Create date: <2016年月日>-- Description:<Register,,>-- ============================================= ALTER PROCEDURE [dbo].[PEOC_Register]-- Add the parameters for the stored procedure here--定义变量@CardID nchar(10),@StudentID nchar(10),@Cash nchar(10),@UserID nchar(10),@Isuse nchar(10),@IsCheck nchar(10),@Carddate nchar(10),@Cardtime nchar(10),@CardType nchar(10),@Computer nchar(10),@Studentname nchar(10),@Sex nchar(10),@Department nchar(10),@Grade nchar(10),@Sclass nchar(10),@Explain nchar(10)ASBEGINdeclare @error int --声明变量(事务)set @error = 0   --赋值(事务)BEGIN TRANSACTION   --事务开始语句--添加学生表insert into dbo.T_Student (StudentID,Studentname ,Sex ,Department ,Grade ,SClass ,Explain )values (@StudentID ,@Studentname ,@Sex ,@Department ,@Grade ,@Sclass ,@Explain )。set @error = @error + @@ERROR --事务--添加卡表insert  into dbo.T_Card (CardID ,StudentID ,Cash ,UserID ,Isuse ,Ischeck ,Carddate ,Cardtime ,Cardtype ,Computer )values (@CardID ,@StudentID ,@Cash ,@UserID ,@Isuse ,@IsCheck ,@Carddate ,@Cardtime ,@CardType ,@Computer)set @error = @error + @@ERROR  --事务--添加充值表insert into dbo.T_Recharge(StudentID ,CardID ,Addmoney ,Rechargedate ,Rechargetime,UserID ,Ischeck)values(@StudentID ,@CardID,@Cash ,@Carddate ,@Cardtime ,@UserID ,@IsCheck )set @error =@error + @@ERROR --事务if @error <> 0ROLLBACK  --发生错误回滚elseCOMMIT    --不发生错误插入END </strong></span>

    这是一个完整的存储过程,还是有点问题,咱们都能看到@error是咱们自己为了事务自定义的变量。那么@@error又是什么呢?我们也没有定义过呀,原来是这样的:

             @@error是系统函数,当没有发生错误时返回0,如果发生错误时@@error<>0,并返回错误号,每个SQL语句执行完,@@error值都会变。

    了解了这些我们就能很容的看懂这个事务了。


     重构还真是开阔了我的眼界,我已经对下面的内容迫不及待了!


1 0
原创粉丝点击