一、存储过程:
关于存储过程的介绍已经在之前的博客中总结过了,预知详情,猛戳这里。
二、数据库事务:
事务(Transaction)是构成单一逻辑工作单元的操作集合,要么完整地执行,要么不执行。事务是数据库环境中一个逻辑工作单元,相当于操作系统中“进程”的概念。一个事务由应用程序中的一组操作序列组成,在程序中,事务以BEGIN TRANSACTION语句开始,以COMMIT语句或ROLLBACK语句结束。
COMMiT语句表示事务执行成功结束,该事务对数据库的所有更新都已写入磁盘。ROLLBACK语句表示事务执行不成功地结束(回滚),该事务对数据库的所有更新必须被撤销,数据库应恢复该事务到初始状态。
1、事务的ACID性质:
①原子性(Atomicity):要么都执行,要么不执行,不可分割。
②一致性(Consistency):事务完成后,必须使所有的数据保持一致的状态。
③隔离性(Isolation):当多个事务并发执行时,系统应保证与这些事务先后单独执行的结果一样。也就是说,几个事务并发执行,彼此之间没有影响。相互隔离。
④持久性(Durability):事务完成之后,对于系统的影响是持久性的,不会丢失,即使以后系统发生故障,也是如此。
2、事务的优点:
①可以简化错误恢复,并使应用程序更加可靠。
②特别是涉及银行交易时,利用事务保证了交易的平稳性和可预测性。
三、在机房重构中的应用:
1、简单梳理:
以注册为例,当我注册的时候,需要完成一系列相关的工作。①把与卡号有关的信息插入到卡表(T_Card)中。②把与学生有关的信息插入到学生表(T_Student)中。③把注册金额插入到充值记录表(T_Recharge)中。将这一系列操作看成一个存储过程,要么全部执行,要么不执行。
2、存储过程+事务回滚的代码展示:
<span style="font-family:KaiTi_GB2312;font-size:18px;">ALTER PROCEDURE [dbo].[PROC_Register] @CardNo char(10), @StudentNo char(10), @Studentname ntext,@sex nchar(10),@Department nchar(10),@Grade nchar(10),@Major nchar(10),@Class nchar(10), @Cash decimal(18,2),@Type char(8),@status char(16),@Explain char(50),@Head nchar(10),@CheckStatus char(16),@Date date,@Time time, @RechargeMoney decimal(10,4),@RechargeDate date,@RechargeTime time AS BEGIN --开始一个事务 begin transaction -- 添加卡表 insert into T_Card(StudentNo,CardNo,Cash,Head,Type,Status,CheckStatus,Date,Time)values(@StudentNo,@CardNo,@Cash,@Head,@Type,@status,@checkStatus,@Date,@Time) -- 添加学生表 insert into T_Student(StudentNo,StudentName,Sex,Department,Grade,Major,Class,Explain,Date,Time)values(@StudentNo,@StudentName,@sex,@Department,@Grade,@Major,@Class,@Explain,@Date,@Time) -- 添加到充值记录表 insert into T_Recharge(CardNo,RechargeMoney,RechargeTime,RechargeDate,Head,CheckStatus)values(@CardNo,@RechargeMoney,@RechargeTime,@RechargeDate,@Head,@CheckStatus) --如果数据操作无误 if @@error=0 --事务提交语句 commit transaction else --事务回滚语句 rollback transaction END</span>
刚开始使用存储过程的时候,各种出错,各种不适应,并且也没有考虑事务回滚的问题,直到今天才想着把它完善起来。不得不说,存储过程的功能真的很强大!顺便分享一篇介绍存储过程和事务回滚的博客。猛戳这里。
从开始的畏惧到现在的熟悉,这是一个过程。我们要本着盲人摸象的精神,不是因为会了才去做。而是因为做了才会。加油~~~