课外天地 李树青学习天地数据库系统原理课件 → 课件9下载——事务处理


  共有20137人关注过本帖树形打印复制链接

主题:课件9下载——事务处理

帅哥哟,离线,有人找我吗?
admin
  1楼 博客 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 管理员
等级:管理员 帖子:1939 积分:26594 威望:0 精华:34 注册:2003/12/30 16:34:32
课件9下载——事务处理  发帖心情 Post By:2006/5/22 20:54:24 [只看该作者]

Flash课件浏览为:

http://www.njmars.net/UploadFile/DB/九)事务处理_.swf

课件下载链接为:

点击下载(SWF文档)

1 概念 隶属于数据恢复的范畴,实现数据完整性目标,主要技术是利用日志来实现的 处理的问题主要是不严重但易产生数据不一致和数据丢失的故障

四个特性: 原子性(Atomicity):要么全做,要么全不做 一致性(Consistency):维护数据库规则的一致,由其他三项涵盖 隔离性(Isolation):处理并发事务时能将不同事务区分开来,依赖于锁定功能,在“并发性”和“一致性”之间权衡 持久性(Durability):提交事务一定全部完成,回滚事务一定全部取消

2 事务处理的实现 主要利用日志来实现

3 事务的分类 显式事务 隐性事务 自动提交事务

3.1 显式事务 显式地定义其开始和结束的事务 当明确键入 BEGIN TRANS 和 COMMIT 语句时,就会发生显式事务 显式事务模式持续时间仅是该事务的持续期

3.2 隐性事务 通过Transact-SQL SET IMPLICIT_TRANSACTIONS ON 语句,将隐性事务模式设置为打开 当连接以隐性事务模式进行操作时,Microsoft SQL Server 将在提交或回滚当前事务后自动启动新事务 无须描述事务的开始,只需提交或回滚每个事务

3.3 自动提交事务 所有Transact-SQL语句在完成时,都会提交或回滚 如果一条语句成功完成,则将其提交,如果遇到任何错误,则将其回滚 只要没有用显式或隐性事务模式替代自动提交模式,SQL Server连接就以自动提交模式为默认模式进行操作

4 事务编程 BEGIN TRANSACTION 开始事务 COMMIT TRANSACTION 提交事务 ROLLBACK TRANSACTION 回滚事务 SAVE TRANSACTION 在事务内设置保存点

5 事务的隔离 如没有锁定且多个用户同时访问一个数据库,则当他们的事务同时使用相同的数据时可能会发生问题,问题包括: 丢失或覆盖更新 未确认的相关性(脏读) 不一致的分析(非重复读) 幻像读 事务的隔离

5.1 丢失或覆盖更新 当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新 每个事务都不知道其它事务的存在 最后的更新将重写由其它事务所做的更新,这将导致数据丢失 例如两个编辑人员制作了同一文档的电子复本。每个编辑人员独立地更改其复本,然后保存更改后的复本,这样就覆盖了原始文档。最后保存其更改复本的编辑人员覆盖了第一个编辑人员所做的更改。如果在第一个编辑人员完成之后第二个编辑人员才能进行更改,则可以避免该问题

5.2 未确认的相关性 第二个事务正在读取的数据还没有确认并且可能由更新此行的事务所更改 例如一个编辑人员正在更改电子文档。在更改过程中,另一个编辑人员复制了该文档(该复本包含到目前为止所做的全部更改)并将其分发给预期的用户。此后,第一个编辑人员认为目前所做的更改是错误的,于是删除了所做的编辑并保存了文档。分发给用户的文档包含不再存在的编辑内容,并且这些编辑内容应认为从未存在过。如果在第一个编辑人员确定最终更改前任何人都不能读取更改的文档,则可以避免该问题

5.3 不一致的分析(非重复读) 在不一致的分析中,第二个事务读取的数据是由已进行了更改的事务提交的 不一致的分析涉及多次(两次或更多)读取同一行,而且每次信息都由其它事务更改;因而该行被非重复读取 例如一个编辑人员两次读取同一文档,但在两次读取之间,作者重写了该文档。当编辑人员第二次读取文档时,文档已更改。原始读取不可重复。如果只有在作者全部完成编写后编辑人员才可以读取文档,则可以避免该问题

5.4 幻像读 事务第一次读的行范围显示出其中一行已不存在于第二次读或后续读中,因为该行已被其它事务删除 同样,由于其它事务的插入操作,事务的第二次或后续读显示有一行已不存在于原始读中 例如一个编辑人员更改作者提交的文档,但当生产部门将其更改内容合并到该文档的主复本时,发现作者已将未编辑的新材料添加到该文档中。如果在编辑人员和生产部门完成对原始文档的处理之前,任何人都不能将新材料添加到文档中,则可以避免该问题

事务的隔离级别: 未提交读(隔离性最差,灵活性最强):其他事务可以读取本事务中的提交前数据 提交读:其他事务不可以读取本事务中的提交前数据,本事务处理的数据可以被其他事务通过更新操作改变 可重复读:本事务处理的数据不可以被其他事务通过更新操作改变,本事务处理的数据可以被其他事务通过插入操作改变 可串行读(隔离性最强,灵活性最差):本事务处理的数据不可以被其他事务通过插入操作改变

在SQL Server中隔离级Isolation Level是指一个事务和其它事务的隔离程度,即指定了数据库如何保护、锁定那些当前正在被其它用户或服务器请求使用的数据

在SQL Server中有以下四种隔离级 READ UNCOMMITTED:它允许读取已经被其它用户修改但尚未提交确定的数据 READ COMMITTED:在此隔离级下SELECT命令不会返回尚未提交Committed的数据也不能返回脏数据,它是SQL Server默认的隔离级 REPEATABLE READ:在此隔离级下用SELECT命令读取的数据在整个命令执行过程中不会被更改,此选项会影响系统的效能,非必要情况最好不用此隔离级 SERIALIZABLE:最严格的级别,不会发生幻象读

6 锁 锁是在多用户环境中对数据访问的限制 SQL Server 2000使用锁定来确保事务的完整性和数据库的一致性 锁定蕴含的基本概念是用户需要对表的排它访问

锁分为以下三种类型 独占锁:Exclusive Lock 共享锁:Shared Lock 更新锁:Update Lock

独占锁: 独占锁锁定的资源只允许进行锁定操作的程序使用,其它任何对它的操作均不会被接受 执行数据更新命令,即INSERT、UPDATE或DELETE命令时,SQL Server 会自动使用独占锁。但当对象上有其它锁存在时无法对其加独占锁,独占锁一直到事务结束才能被释放

共享锁: 共享锁锁定的资源可以被其它用户读取,但其它用户不能修改它。在SELECT命令执行时,SQL Server通常会对对象进行共享锁锁定。通常加共享锁的数据页被读取完毕后,共享锁就会立即被释放

更新锁: 更新锁是为了防止死锁而设立的,当SQL Server准备更新数据时,它首先对数据对象作更新锁锁定。这样数据将不能被修改但可以读取,等到SQL Server确定要进行更新数据操作时,它会自动将更新锁换为独占锁,但当对象上有其它锁存在时无法对其作更新锁锁定

死锁 事务1请求了事务2加锁的资源,事务2又请求了事务1加锁的资源

避免死锁的原则 尽量避免并发地执行涉及到修改数据的语句 要求每个事务一次就将所有要使用的数据全部加锁否则就不予执行 预先规定一个封锁顺序,所有的事务都必须按这个顺序对数据执行封锁,例如不同的过程在事务内部对对象的更新执行顺序应尽量保持一致 每个事务的执行时间不可太长,对程序段长的事务可考虑将其分割为几个事务

[此贴子已经被作者于2006-12-14 6:24:09编辑过]

 回到顶部