这次在机房收费系统合作中,用到了存储过程和事务处理,看似复杂的代码,其实背后有它不为人知的秘密,那就是更加简便的应用。下面我会根据自己的理解来谈论一下关于存储过程+事务是如何实现注册操作的。
事务的概念
那么,什么是事务呢?首先,让我们来了解一下事务的概念:事务是一种机制、一种操作序列,它包含了一组数据库操作命令作为一个整体一起向系统提交或撤消,这组命令要么全部执行,要么全部不执行。事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时事务是做为最小的控制单元来使用的。事务这种机制适用于多用户操作的数据通信系统,比如:订票系统、银行系统、保险公司系统等。
事务的属性
- 原子性(Atomicity):事务中的所有元素作为一个整体提交或回滚,事务的各元素是不可分的,事务是一个完整的操作;
- 一致性(Consistency):事务完成时,数据必须是一致的,也就是说,和事务开始之前,数据存储中的数据处于一致状态,保证数据的无损;
- 隔离性(Isolation):对数据进行修改的多个事务是彼此隔离的,这表明事务必须是独立的,不应该以任何方式依赖于或影响其他事务;
- 持久性(Durability):事务完成之后,它对于系统的影响是永久的,该修改即使出现系统故障也将一直保留,真实的修改了数据库。
创建事务
T-SQL中管理事务的语句
- 开始事务:BEGIN TRANSACTION
- 提交事务:COMMIT TRANSACTION
- 回滚事务:ROLLBACK TRANSACTION
事务的分类
按事务的启动和执行方式,可将事务分为3类:
- 显式事务:也称之为用户定义或用户指定的事务,即可以显式地定义启动和结束的事务,分布式事务属于显式事务。
- 隐式事务:当连接以此模式进行操作时,sql将在提交或回滚当前事务后自动启动新事务。无须描述事务的开始,只需要提交或回滚每个事务。它生成连续的事务链。
- 自动提交事务:SQL Server的默认模式,它将每条单独的T-SQL语句视为一个事务,如果成功执行,则自动提交事务,如果失败,则回滚事务。
事务实例
用户注册操作涉及到了两个表,分别为:学生信息表(T_StudentInfo)和充值记录表(T_RechargeInfo),每注册一个用户,在相应的充值表中也应该添加一条充值记录,因为注册时需要添加账户金额。下面让我们看一下相关代码。
USE [Systemdb]
GO
/****** Object: StoredProcedure [dbo].[PROREGIST] Script Date: 08/12/2012 11:06:40 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =======================================================================================================================
-- Author: ****
-- Create date: 2012/8/12,10:11
-- Description: 注册操作的存储过程,添加事务的处理过程,涉及到两个表,分别是:T_StudentInfo,T_RechargeInfo
-- =======================================================================================================================
ALTER PROCEDURE [dbo].[PROREGIST]
-- 添加参数
@cardNo VARCHAR(20),--传入卡号
@studentID VARCHAR(20),--传入学号
@studentName VARCHAR(20),--传入姓名
@cardBalance DECIMAL(18,2),--传入余额
@studentGender VARCHAR(10),--传入性别
@studentSubject VARCHAR(50),--传入院系
@studentGrade VARCHAR(20),--传入年级
@studentClass VARCHAR(20),--传入班级
@studentNote VARCHAR(50),--传入注释
@registAdmin VARCHAR(10)--传入管理员
AS
BEGIN
DECLARE @Err1 INT,@Err2 INT--定义错误计数器
BEGIN TRANSACTION-- 开始事务
--插入学生信息到学生表
INSERT INTO T_StudentInfo (card_No,student_ID,student_Name,[card_Balance],student_Gender,student_Subject,student_Grade,student_Class,student_Note,regist_Administrator,regist_DateTime,if_Check)
VALUES(@cardNo,@studentID,@studentName,@cardBalance,@studentGender,@studentSubject,@studentGrade,@studentClass,@studentNote,@registAdmin,GETDATE(),0)
SET @Err1 = @@ERROR --出错给错误计数器赋值,变量不为0.
--插入充值记录到充值表
INSERT INTO T_RechargeInfo (card_No,recharge_Cash,recharge_Administrator,recharge_DateTime,if_Check)
VALUES(@cardNo,@cardBalance,@registAdmin,GETDATE(),0)
SET @Err2 =@@ERROR --出错给错误计数器赋值,变量不为0.
IF @Err1 =0 AND @Err2 = 0 --判断错误计数器中的值是否为0
COMMIT TRANSACTION --提交事务
ELSE
ROLLBACK TRANSACTION --出错,事务回滚,恢复到初始状态,没有任何改动
END
结束语
利用存储过程+简单事务,来处理注册中对两个表的操作,如果任何一个操作出现问题,事务都会回滚到,恢复到初始状态,如果操作成功,则直接进行提交事务。这样就避免了只对其中一个表进行更新,而对另外一个表没有任何操作,在后续的查询、更新、删除时就不会出现不必要的错误了。
上面简单的谈了一下事务的处理,仅限个人的理解,如有错误的观点,还请各位大虾指出。
本文介绍使用存储过程结合事务处理在注册操作中的应用。通过具体实例说明如何确保数据的一致性和完整性,即使遇到错误也能恢复到初始状态。
1330

被折叠的 条评论
为什么被折叠?



