1、事务和锁,课程目标,创建事务提交事务回滚事务回滚事务的一部分用锁解决潜在问题SQL Server 锁设置锁选项,事务,例:要进行货物调拨,把指定仓库中的一定数量的商品调拨到另一个仓库中。问:(如何确保这个操作一定可以一起完成),设置多个操作必须全部执行成功,否则立即恢复到未执行任何操作时的状态是一个逻辑工作单元,单元中包含一批操作具有ACID四个性质原子性:不可只完成部分操作一致性:在处理成功后,所有数据都保持一致状态独立性:禁止其它事务看到本事务的中间状态持久性:一个已完成的事务对数据所作的任何变动在 系统中是永久有效的,自定义事务,Begin Transaction 事务名 执行自定义事务
2、 Commit Transaction 事务名 如果全部成功,提交事务Save Transaction 保存点名 顾名思义,定义事务的某个执行位置 Rollback Transaction 保存点名 回滚事务到事务的保存点位置 注:1、如果回滚到保存点,并不提交事务 2、trancount 存储当前的事务数量,自定义事务的实现方式,Rollback,问:如有下列操作系列,结果会如何 begin transaction update student set cphone=12345678 where sid=A00001 update student set cname=aaa where si
3、d=A00001 rollback transaction,Rollback,例:如果在调拨过程中要求记载下来调拨信息,若发现被调货的仓库的库存不够,则整个操作全部取消,事务类型,显示事务:由用户指定事务的开始和结束自动事务:每个语句视为一个事务隐式事务:开始执行语句就视为一个事务的开始,但语句执行完后,事务并不结束(由用户显示提交) set implicit_transactions on | off,数据并行问题,所谓数据并行的问题就是指当数据同时进行事务处理时所发生的问题。,数据并行问题,1、遗失更新:当两个或多个事务试图修改同一行时,事务队列中最后的更新会重写前面事务所作的修改,资源
4、A =100 事务A 事务B read A read A update A+50 write A update A+10 write A,数据并行问题,2、无效读入 :一个事务读取了尚未认可的更新数据,资源 A =100 事务A 事务B read A update A+50 read A write A update A+10 rollback write A,数据并行问题,3、不一致分析:指事务连续两次读取数据时,所得到的数据不一致,资源 A =100 事务A 事务B read A update A+50 read A update A+10 read A write A,数据并行问题,4、
5、幻象读取:读取到了并不存在的数据,资源 A =100 事务A 事务B read A update A+50 create B read A read B del B update B+80 write B,锁,并行问题的解决方法:锁在功能上避免用户访问正在被其它用户改变的信息,在多用户环境中,避免一些用户同时改变同样的数据SQL Server 使用锁来维护多用户环境下的数据的一致性,SQL Server自动处理锁的行为,锁,Server实现了多粒度上锁,允许事务以不同级别对不同类型的资源上锁行级页级范围表级,共享锁定(S):常用于读事务,允许一个资源上有多个共享锁定,防止其它事务修改资源排它锁
6、定(X):用于写事务,一个资源上只能有一个排它锁定,防止并发事务对资源进行访问,更新锁定(U):用于防止死锁,一个资源上只能有一个更新锁定,且只有获得更新锁定的事务才能获得排它锁定意向锁定(I):让事务声明它将在资源上使用共享、独占、更新锁定模式锁定(S):1、结构模式修改锁定 2、结构描述固定锁定,锁定模式,例:用户A 用户 BBegin transaction begin transaction update student update class set cclassid=c0002 set iperson=iperson+1 select * from class where ccl
7、assid=c0001Commit transaction select * from student commit transaction若这两个事务共时提交会产生什么情况,分析,死锁,死锁:是两个用户分别锁定了不同的对象,且又试图访问另一个用户锁定对象时产生的,理解锁,当产生死锁时,SQL-Server会终止占用最少CPU时间的进程,终止的事务会自动回滚,并给出一个1205的错误SQL Server提供SET DEADLOCK_PRIORITY命令来定制死锁语法SET DEADLOCK_PRIORITY LOW|NORMAL|deadlock_var定制LOCK_TIMEOUT SET LOCK_TIMEOUT命令可被用来设置等待被阻塞资源语句的最长时间,事务日志是一个数据库的数据修改历史,在创建一个数据库时,SQL server会自动创建一个事务日志文件采用提前写的方式,即对数据库的修改,首先会写入到日志中,然后才写入数据库每一个数据修改都会标出一个开始点和结束点,如果由于各种原因未达到结束点,则会恢复前面所做的所有操作SQL Server通过维护日志来管理所有的事务,可用于恢复如电源故障等原因不能完成的所有活动。,事务日志,