1、写一个存储过程执行银行转账的功能,假设数据库中有账户表写一个存储过程执行银行转账的功能,假设数据库中有账户表Account(UserName,UserAccount),现要将用户,现要将用户A转账到用户转账到用户B一定的金额,一定的金额,完成存储过程。完成存储过程。create proc prcTransferOriginUser varchar(20),DesUser varchar(20),Money money As if(select UserAccount from Account where UserName=OriginUser)=Money beginupdate Accoun
2、t set UserAccount=UserAccount-Money where UserName=OriginUserupdate Account Set UserAccount=UserAccount+Money where UserName=DesUser end.假设程序执行到第一个更新语句时断电假设程序执行到第一个更新语句时断电了?了?第七章第七章事务的概念及创建事务的概念及创建事务的概念事务的概念创建包含事务的存储过程创建包含事务的存储过程保存部分事务保存部分事务 SQL Server提供了一种叫做事务的机制,它可以保证指定提供了一种叫做事务的机制,它可以保证指定的对数据库的一系
3、列操作作为一个整体被执行,在最终提的对数据库的一系列操作作为一个整体被执行,在最终提交操作之间,用户可以随时取消前面的操作,将数据库还交操作之间,用户可以随时取消前面的操作,将数据库还原到没有执行操作前的状态原到没有执行操作前的状态,或者操作全部完成,将所有的或者操作全部完成,将所有的操作提交到数据库。操作提交到数据库。原子性原子性:事务必须是原子工作单元。它对数据库所进行的操作,要么事务必须是原子工作单元。它对数据库所进行的操作,要么全都执行,要么全都不执行。全都执行,要么全都不执行。一致性一致性:事务在完成时,必须使所有的数据都保持一致状态。在相关事务在完成时,必须使所有的数据都保持一致状
4、态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构整性。事务结束时,所有的内部数据结构(B数索引数索引)都必须是正确的。都必须是正确的。隔离性隔离性:由并发事务所作的修改必须与任何其他并发事务所作的修改由并发事务所作的修改必须与任何其他并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间之前的状态,要么是另一事务修改它之后的状态,事务不
5、会查看中间状态的数据。状态的数据。持久性持久性:事务完成之后,它对于系统的影响是永久性的。该修改即使事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。出现系统故障也将一直保持。启动事务:启动事务:BEGIN TRANSACTION 事务名事务名回滚事务:回滚事务:ROLLBACK TRANSACTION 事务名事务名提交事务:提交事务:COMMIT TRANSACTION 事务名事务名注意,注意,不能在发出不能在发出COMMIT TRANSACTION语句之后回滚事务语句之后回滚事务,因为数据修改已,因为数据修改已经成为数据库的永久部分。经成为数据库的永久部分。定义
6、一个事务,向定义一个事务,向“学生学生”表中插入两条记录。其中,第表中插入两条记录。其中,第1条条INSERT语句是正确的,而第语句是正确的,而第2条条INSERT语句是错误的。执行此事务语语句是错误的。执行此事务语句后,查看句后,查看“学生学生”表中的数据,确认第表中的数据,确认第1条语句没有被执行。条语句没有被执行。解决方案:解决方案:create proc prcInsertStudentasbegin trybegin transactionINSERT INTO Student VALUES(A00010,Andy,21,男男,Nanjing,90,1)INSERT INTO Stu
7、dent VALUES(A00011,mary,21,女女,Nanjing,150,1)commit transactionend trybegin catchprint 出错了出错了end catch思考:编译器执行到第二个思考:编译器执行到第二个insert语句时,会如何处理?语句时,会如何处理?Rollback transactionCREATE PROC 存储过程名存储过程名参数名参数名 参数类型参数类型,nASBEGIN TRYIF EXISTS()BEGINBEGIN TRANSACTION/执行事务语句执行事务语句COMMIT TRANSACTIONENDELSE/信息不存在信息
8、不存在END TRYBEGIN CATCHROLLBACK TRANSACTIONEND CATCH创建事务,假设给定学号的学生将从原系转入给定的系,则相应的系总人数将创建事务,假设给定学号的学生将从原系转入给定的系,则相应的系总人数将发生变化,如果两系相差人数小于发生变化,如果两系相差人数小于10,则允许该生转系,否则回滚事务。假设,则允许该生转系,否则回滚事务。假设系表系表Department(DepID,DepName,Total)解决方案:解决方案:求出给定学号对应的原系号求出给定学号对应的原系号求出给定转入的系名对应的系号求出给定转入的系名对应的系号更新学生表中该学号对应的新系号更新学生表中该学号对应的新系号将系表中原系号对应的总人数将系表中原系号对应的总人数-1将系表中转入的系号对应的总人数将系表中转入的系号对应的总人数+1获取原系号对应的人数获取原系号对应的人数获取新系号对应的人数获取新系号对应的人数如果人数相差如果人数相差=-10 and OrginalTotal-NewTotal100BEGINROLLBACK TRANSACTION trnTransaction1commit transactionENDELSE commit transaction事务的概念事务的概念创建包含事务的存储过程创建包含事务的存储过程创建事务创建事务