资源描述:
《15[1].事务与锁》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、事务与锁实际的工作中,经常会出现这种情况,两个用户同时修改一条记录,或者一个用户正在删除,另一个却在读取,这些都会造成数据的不一致性,SQLServer为了解决这个问题,使用了事务与锁的概念。1.两位老师同时更改一条学生信息出现的问题(利用查询分析器模拟)a.单击“新建查询”按钮,新建一个查询,输入如下代码:/*修改学生编号为2006010的学生姓名*/USEschoolGOBEGINTRANSACTIONT1----使用事务UPDATEstudentSETname=’Long’WHEREid=2006010GOSELECT*FROMstudentGO选中运行上述代
2、码b.再新建一个查询,输入如下代码:/*修改学生编号为2006010的学生姓名*/USEschoolGOBEGINTRANSACTIONT2---使用事务UPDATEstudentSETname=’Tank’WHEREid=2006010GOSELECT*FROMstudentGO选中运行上述代码c.在第一个查询界面,输入如下代码:/*使用ROLLBACK命令*/ROLLBACKGOSELECT*FROMstudentGO选中运行上述代码d.此时查看第二个查询界面e.在第二个查询界面中输入如下代码:/*使用ROLLBACK*/ROLLBACKGOSELECT*FRO
3、MstudentGO选中运行上述代码2.什么是事务事务是单个的逻辑工作单元,如果某一事务成功,则在该事务中进行的所有数据更改提交,成为数据库中的永久组成部分。如果事务运行的过程中出现了错误,则数据修改就会被全部取消(在数据库中称之为ROLLBACK)。事务用通俗的话来解释就是要么全部执行,要么全部不执行,这就是原子性。事务分为以下几种:a.自动提交事务:每条单独的语句都是事务。每一条语句实际上都是事务,对于INSERT来说,输入的这些数值,如果有一个数据类型不符或者数值的长度过大,就会报错,也就是说,要么所有的数据都插入到一行中,要么所有的数据都没有插入到数据库中,
4、这就是一个自动提交事务。b.显示事务:每个事务均以BEGINTRANSACTION语句开始,以COMMIT或ROLLBACK结束。c.隐性事务:在前一个事务完成时,新事务启动,但仍以COMMIT或ROLLBACK语句显示完成。d.批处理级事务:只能应用于多个活动结果集(MARS),在MARS会话中,启动的Transact—SQL显示或隐性变为批处理级事务。当批处理完成时,没有提交或回滚的事务将自动由SQLServer进行。3.并发性问题例如:现有两家小的银行需要帐户之间转帐,通过两个存储过程来描述这次转帐。(1)不使用事务造成的数据不一致性/*创建两个存储用户储蓄的
5、账户*//*创建两张结构相同的表格,表格名称分别为bank1与bank2*/USEschoolGOCREATETABLEbank1(deposit_idINT,---储蓄账户编号nameCHAR(20),---储蓄账户的名称depositMONEY--储蓄额)GOCREATETABLEbank2(deposit_idINT,---储蓄账户编号nameCHAR(20),---储蓄账户的名称depositMONEY--储蓄额)GO/*在表格bank1以及bank2中录入信息*/---在bank1中录入两条信息INSERTINTObank1(deposit_id,name
6、,deposit)VALUES(1001,’王云’,10000)GOINSERTINTObank1(deposit_id,name,deposit)VALUES(1002,’李治’,20000)GO---在bank2中录入两条信息INSERTINTObank2(deposit_id,name,deposit)VALUES(1003,’张冶’,9000)GOINSERTINTObank2(deposit_id,name,deposit)VALUES(1004,’李婷’,30000)GO/*创建两个转账的存储过程*//*创建名称为transfer_bank1与trans
7、fer_bank2的存储过程*/--开始创建transfer_bank1存储过程CREATEPROCEDUREtransfer_bank1@deposit_idINT,@depositMONEYASUPDATEbank1SETdeposit=deposit+@depositWHEREdeposit_id=@deposit_idGO--开始创建transfer_bank2存储过程CREATEPROCEDUREtransfer_bank2@deposit_idINT,@depositMONEYASUPDATEbank2SETdeposit=deposit+@depo