一、存储过程 (StoredProcedure)是在大型数据库中,一组为了完成特定功能的SQL语句集,经编译后存储在数据库,用户通过指定存储过程的名字并给出参数(如果该过程带有参数)来执
行它。
1、存储过程的优点:
1)存储过程只在创造时进行编译,以后每次执行存储过程都不需要重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储提高数据库的执行速度。
2)当对数据库进行复杂操作时(如对多个表进行Update,Insert,Quey,Delete时),可将此复杂操作用于存储过程封装起来与数据提供的数据结合起来一起使用。
3)存储过程可以重复使用,可减少数据库开发人员的工作量。
4)安全性高,可设定只有某此用户才具有对指定存储过程的使用权。
二、数据库事务(DatabaseTransaction),是指作为单个逻辑工作单元执行的一系列操作。通过将一组相关操作组合为一个要么全部成功,要么全部失败的单元。
1、事务的属性:
1)原子性:要么都执行,要么都不执行;不可分割。
2)一致性:事务完成后,必须使所有的数据保持一致的状态。维护数据库数据的完整性!
3)隔离性:由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。
4)持久性:事务完成之后,它对于系统的影响是永久性的。该修改即使出现致命的系统故障也将一直保持。
2、事务的优点:
1)使用事务:可以简化错误恢复并使应用程序更加可靠。
2)特别是涉及到银行交易时,利用事务保证了交易的平稳性和可预测性的技术。
理论知识先简单介绍到这里,下面介绍一下:存储过程与事务在机房收费系统个人版中的应用。还请大家多多指导:
以充值为例,当我给某学生充值的时候,需要做这些工作,1)它需把充的值与T_Student表中的余额进行累加;2)还需要把充的值的卡号,充值金额,日期和时间插入到T_AndMoney当中。
此例子的程序设计思路:从UI层传递参数------->Facade----->BLL------>Factory+IDAL------>DAL(调用存储过程来实现多表操作,如果成功返回为True,否则捕获异常)------->逐层返回Boolean类型,直到UI根据返回值给出是否成功提示。
DAL代码:
Public Class SqlserverStudent : Implements IDAL.StudetInfo
'用配置文件设置连接字符串
Dim strConnStr As String = ConfigurationManager.AppSettings("connStr")
Dim conn As SqlConnection = New SqlConnection(strConnStr)
'充值金额
Public Function FindStu2(ByVal enStudent As Entity.StudentEntity) As Boolean Implements IDAL.StudetInfo.FindStu2
'把存储过程名称赋值给字符串
Dim strSql As String = "PRO_AndMoney"
'实例化一个cmd的命令
Dim cmd As New SqlCommand(strSql, conn)
'给参数赋值
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add(New SqlParameter("@cardNo", enStudent.CardNo))
cmd.Parameters.Add(New SqlParameter("@addMoney", enStudent.Money))
cmd.Parameters.Add(New SqlParameter("@describe", enStudent.describe))
cmd.Parameters.Add(New SqlParameter("@date", enStudent.AddDate))
cmd.Parameters.Add(New SqlParameter("time", enStudent.AddTime))
Try
conn.Open()
'通过该句判断是否执行成功。
cmd.ExecuteNonQuery()
Catch ex As Exception
’如果存储过程发生事务回滚,则会捕获异常。
MsgBox(ex.Message)
End Try
Return True
End Function
数据库中存储过程+事务:
USE [Charge3]
GO
Create PROCEDURE [dbo].[PRO_AndMoney](@cardNo varchar(8),@addMoney varchar(10),@describe varchar(50),@date varchar(10),@time varchar(8))
as
Begin --事物
set Nocount on; --开启时
set xact_abort on;--当xac_abort的参数为on时,可以检测是否错误,如果错误,不会提交,反而会回滚所有的操作。
begin Tran --开始一个事物
--更新学生表中的字段
update T_Student set money= cast((cast(@addMoney as int )+cast(money as int)) as varchar) where cardNo =@cardNo
--向充值表中插入一条记录 (数据类型转化,cast(变量,转换的类型))
insert into T_AddMoney (cardNo ,addMoney ,addDate ,addTime ) VALUES(@cardNo,@addMoney,@date ,@time )
--如果数据操作无错误
if @@ERROR =0
commit Tran --提交事务
else
rollback Tran --回滚事务
end
通过D层返回值,最终反馈成UI层,即可完成操作。
知识补充:事务内设置保存点
用户可以在事务内设置保存点或标记。保存点定义如果有条件地取消事务的一部分,事务可以返回的
位置。如果将事务回滚到保存点,则必须(如果需要,使用更多的Transact-SQL 语句和 COMMIT
TRANSACTION语句)继续完成事务,或者必须(通过将事务回滚到其起始点)完全取消事务。若要
取消整个事务,请使用 ROLLBACK TRANSACTIONtransaction_name 格式。这将撤消事务的所有语句和
过程。
代码:
Create Procedure MyProcedure AS Begin Set NOCOUNT ON; Set XACT_ABORT ON; begin tran ok --开始一个事务OK delete from rxqz where qz= 'rx015 ' --删除数据 save tran bcd --保存一个事务点命名为bcd update sz set name='李丽s' where name= '李丽'--修改数据 if @@error<>0 --判断修改数据有没有出错 begin --如果出错 rollback tran bcd -- 回滚事务到BCD 的还原点 commit tran ok --提交事务 end else --没有出错 commit tran ok --提交事务 End
说明:1、@@error判断是否有错误,为0表示没有错误,但是对那种重大错误无法捕捉,而且@@error只能前一句sql语句生效。
注意:数据库中类型转化,cast(变量,转换的类型)
一点小心得给大家分享一下:
1、只空想,不实现,只是徒劳!
2、我们所想要的答案几乎都在网上,战胜恐惧,真的没有什么大不了!
3、学习要定要心静!浮躁只能削弱你的积极性,浪费时间,降低效率!