数据库事务和锁(三)

数据|数据库

使用事务的考虑

在使用事务时,原则上应该使事务尽可能得短并且要避免事务嵌套。事务应该尽可能得短,这是因为比较长的事务增加了事务占用数据的时间,使其它必须等待访问该事务锁定数据的事务,延长了等待访问数据的时间。在使用事务时,为了使事务尽可能得短,应该采取一些相应的方法。为了最小化时间,在使用一些Transact-SQL语句时,一定要非常小心。例如,当使用循环语句WHILE时,一定要事先确认循环的长度和占用的时间,使这种循环在完成相应的功能之前,一定要确保循环尽可能得短。在开始事务之前,一定要了解需要用户交互式操作才能得到的信息。这样,在事务的进行过程中,就可以避免进行一些耗费时间的交互式操作,缩短事务进程的时间。在一个用户定义的事务中,应该尽可能地使用一些数据操纵语言,例如INSERT、UPDATE和DELETE语句,因为这些语句主要是操纵数据库中的数据。而对于一些数据定义语言,应该尽可能地少用或者不用,因为这些数据定义语言的操作既占用比较长的时间,又占用比较多的资源,并且这些数据定义语言的操作通常不涉及到数据,所以应该在事务中尽可能地少用或者不用这些操作。另外,在使用数据操纵语言时,要注意,一定要在这些语句中使用条件判断语句,使得这些数据操纵语言涉及到尽可能少的记录,从而缩短事务的处理时间。

在嵌套事务时,也要注意一些问题。虽然说,在事务中间嵌套事务是可能的,并不影响SQL Server处理事务的性能。但是,实际上,使用嵌套事务,除了把事务搞得更加复杂之外,并没有这么明显的好处。因此,不建议使用嵌套事务。

事务的类型

根据系统的设置,可以把事务分成两种类型。一种是系统提供的事务,另一种是用户定义的事务。系统提供的事务是指在执行某些语句时,一条语句就是一个事务。这时要明确,一条语句的对象既可能是表中的一行数据,也可能是表中的多行数据,甚至是表中的全部数据。因此,只有一条语句构成的事务也可能包含了多行数据的处理。例如执行下面这条数据操纵语句:

UPDATE  authors

SET state = ‘CA’

这是一条语句,这条语句本身就构成了一个事务。这条语句由于没有使用条件限制,那么这条语句就是修改表中的全部数据。所以这个事务的对象,就是修改表中的全部数据。如果authors表中有1000行数据,那么这1000行数据的修改要么全部成功,要么全部失败。

另外一种事务,是用户明确定义的事务。在实际应用中,大多数的事务处理就是采用了用户定义的事务来处理。在开发应用程序时,可以使用BEGIN TRANSACTION语句来定义明确的用户定义的事务。在使用用户定义的事务时,一定要注意两点:一是事务必须有明确的结束语句来结束。如果不使用明确的结束语句来结束,那么系统可能把从事务开始到用户关闭连接之间的全部操作都作为一个事务来对待。事务的明确结束可以使用这样两个语句中的一个:COMMIT语句和ROLLBACK语句。COMMIT语句是提交语句,将全部完成的语句明确地提交到数据库中。ROLLBACK语句是取消语句,该语句将事务的操作全部取消,即表示事务操作失败。

还有一种特殊的用户定义的事务,这就是分布式事务。前面提到的事务都是在一个服务器上的操作,其保证的数据完整性和一致性是指一个服务器上的完整性和一致性。但是,如果一个比较复杂的环境,可能有多台服务器,那么要保证在多服务器环境中事务的完整性和一致性,就必须定义一个分布式事务。在这个分布式事务中,所有的操作都可以涉及对多个服务器的操作,当这些操作都成功时,那么所有这些操作都提交到相应服务器的数据库中,如果这些操作中有一条操作失败,那么这个分布式事务中的全部操作都被取消。

锁和锁的作用

锁就是防止其他事务访问指定的资源的手段。锁是实现并发控制的主要方法,是多个用户能够同时操纵同一个数据库中的数据而不发生数据不一致现象的重要保障。一般来说,锁可以防止脏读、不可重复读和幻觉读。脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。不可重复读是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。幻觉读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。

时间: 2024-08-02 21:01:24

数据库事务和锁(三)的相关文章

数据库事务和锁(一)

数据|数据库 简述     关系型数据库有四个显著的特征,即安全性.完整性.并发性和监测性.数据库的安全性就是要保证数据库中数据的安全,防止未授权用户随意修改数据库中的数据,确保数据的安全.在大多数数据库管理系统中,主要是通过许可来保证数据库的安全性.完整性是数据库的一个重要特征,也是保证数据库中的数据切实有效.防止错误.实现商业规则的一种重要机制.在数据库中,区别所保存的数据是无用的垃圾还是有价值的信息,主要是依据数据库的完整性是否健全.在SQL Server 7.0中,数据的完整性是通过一系

数据库事务和锁(四)

数据|数据库 空间管理     锁是防止其他事务访问指定的资源控制.实现并发控制的一种主要手段.为了提高系统的性能,加快事务的处理速度,缩短事务的等待时间,应该使锁定的资源最小化.为了控制锁定的资源,应该首先了解系统的空间管理.在SQL Server系统中,最小的空间管理单位是页,一个页有8K.所有的数据.日志.索引都存放在页上.另外,使用页有一个限制,这就是表中的一行数据必须在同一个页上,不能跨页.页上面的空间管理单位是簇,一个簇是8个连续的页.表和索引的最小占用单位是簇.数据库是由一个或者多

数据库事务和锁(五)

数据|数据库 死锁问题 死锁是一个很重要的话题.在事务和锁的使用过程中,死锁是一个不可避免的现象.在两种情况下,可以发生死锁.第一种情况是,当两个事务分别锁定了两个单独的对象,这时每一个事务都要求在另外一个事务锁定的对象上获得一个锁,因此每一个事务都必须等待另外一个事务释放占有的锁,这时,就发生了死锁.这种死锁是最典型的死锁形式.在同一时间内有两个事务A和B,事务A有两个操作:锁定表part和请求访问表supplier:事务B也有两个操作:锁定表supplier和请求访问表part.结果,事务A

数据库事务和锁(二)

数据|数据库 事务的工作原理图 事务确保数据的一致性和可恢复性.事务的工作原理如图1所示. 图1   事务的工作原理图     事务开始之后,事务所有的操作都陆续写到事务日志中.写到日志中的操作,一般有两种:一种是针对数据的操作,一种是针对任务的操作.针对数据的操作,例如插入.删除和修改,这是典型的事务操作,这些操作的对象是大量的数据.有些操作是针对任务的,例如创建索引,这些任务操作在事务日志中记录一个标志,用于表示执行了这种操作.当取消这种事务时,系统自动执行这种操作的反操作,保证系统的一致性

MSSQL与Oracle数据库事务隔离级别与锁机制对比_oracle

一,事务的4个基本特征 Atomic(原子性): 事务中包含的操作被看做一个逻辑单元,这个逻辑单元中的操作要 么全部成功,要么全部失败. Consistency(一致性): 只有合法的数据可以被写入数据库,否则事务应该将其回滚到最初 状态. Isolation(隔离性): 事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正 确性和完整性.同时,并行事务的修改必须与其他并行事务的修改 相互独立. Durability(持久性): 事务结束后,事务处理的结果必须能够得到固化. 以上属于废话

MS SQL Server数据库事务锁机制分析

server|数据|数据库 锁是网络数据库中的一个非常重要的概念,它主要用于多用户环境下保证数据库完整性和一致性.各种大型数据库所采用的锁的基本理论是一致的,但在具体实现上各有差别.目前,大多数数据库管理系统都或多或少具有自我调节.自我管理的功能,因此很多用户实际上不清楚锁的理论和所用数据库中锁的具体实现. Microsoft SQL Server(以下简称SQL Server)作为一种中小型数据库管理系统,已经得到了广泛的应用,该系统更强调由系统来管理锁.在用户有SQL请求时,系统分析请求,自

spring学习笔记(20)数据库事务并发与锁详解

多事务运行并发问题 在实际应用中,往往是一台(或多台)服务器向无数客户程序提供服务,当服务器查询数据库获取数据时,如果没有采用必要的隔离机制,可能会存在数据库事务的并发问题,下面是一些常见的并发问题分类: 1. 第一类丢失更新:撤销一个事务,其他事务已提交的更新数据覆盖 2. 第二类丢失更新:一个事务覆盖另一个事务已提交的更新数据 3. 脏读:一个事务读到另一个事务未提交的数据 4. 虚读:一个事物读到另一个已提交的新插入数据 5. 不可重复读:事务读到另一个事务已提交的更新数据 下面对这几类并

数据库中的锁

11.5.1 锁的概念锁(Lock) 是在多用户环境下对资源访问的一种限制.机制当对一个数据源加锁后,此数据源就有了一定的访问限制.我们就称对此数据源进行了"锁定".在SQL Server中,可以对以下的对象进行锁定: 数据行(Row):数据页中的单行数据: 索引行(Key):索引页中的单行数据,即索引的键值: 页(Page):页是SQL Server 存取数据的基本单位,其大小为8KB: 盘区(Extent):一个盘区由8 个连续的页组成: 表(Table): 数据库(Databas

MS SQL基础教程:数据库中的锁

11.5.1 锁的概念 锁(Lock) 是在多用户环境下对资源访问的一种限制.机制当对一个数据源加锁后,此数据源就有了一定的访问限制.我们就称对此数据源进行了"锁定".在SQL Server中,可以对以下的对象进行锁定: 数据行(Row):数据页中的单行数据: 索引行(Key):索引页中的单行数据,即索引的键值: 页(Page):页是SQL Server 存取数据的基本单位,其大小为8KB: 盘区(Extent):一个盘区由8 个连续的页组成: 表(Table): 数据库(Databa