5. 行 级 锁   锁 机 制 的 改 进 是SQL7 的 重 大 改 进 之 一。SQL7 支 持 对 数 据 行 和 索 引 项(Index Entry) 的 完 全 行 级 锁。 经 过 优 化 的 锁 管 理 程 序(Lock Manager) 可 以 更 快 地 响 应 加 锁 请 求, 从 而 改 善 了 联 机 事 务 处 理(OLTP) 应 用 程 序 的 并 发 性, 特 别 是 当 很 多 程 序 同 时 添 加 记 录 时。  SQL7 的 锁 管 理 程 序 自 动 调 整 加 锁 时 需 要 使 用 的 资 源 数 量, 不 再 需 要 手 工 配 置“locks” 这 个 服 务 器 选 项; 同 时, 针 对 具 体 任 务,SQL7 还 在 页 级 锁 与 行 级 锁 之 间 自 动 选 择, 例 如, 在 查 询 数 据 时 用 页 级 锁 以 提 高 查 询 速 度, 而 在 更 改 数 据 时 用 行 级 锁 以 改 善 并 发 性。   

解决方案 »

  1.   


     我想说个话,可以吗?给个EMAIL 地址给我,让我发给你好了
      

  2.   

    游标加锁
    <%
    '游标类型
        Const adOpenForwardOnly = 0
            Const adOpenKeyset = 1
            Const adOpenDynamic = 2
            Const adOpenStatic = 3
                          
    '加锁类型
            Const adLockReadOnly = 1
            Const adLockPessimistic = 2
            Const adLockOptimistic = 3
            Const adLockBatchOptimistic = 4 
    >%
                          
        <% Set Conn = Server.CreateObject('ADODB.Connection') >%
        <% Set RSMov = Server.CreateObject('ADODB.RecordSet') >%
        <% Conn.Open 'Soc', '', '' >%
        <% RSMov.Open sqlMov, Conn, adOpenKeyset, adLockReadOnly >%
    游标使用时是比较灵活的,它有时用来描述一个记录集,有时又是用来描述当前记录集中某一条记录的指针。游标主要是用来建立一个关系数据库中行/列关系的一种SQL可利用的访问格式。与游标有关系的技术术语还有一个叫Book的。如果你选择的游标方式支持Books。数据库将提供有关记录数目的强大功能。
    在上面写出的那么多游标方式中,adOpenDynamic是没有太的用处的,虽然它提供实时显示数据库中的记录的所有更新操作的功能,但是因为并不是所有的数据库都支持该游标方式,没有移植性的游标方式对当前错综复杂的数据库来说真是用处不大。在实际的编程中,我相信大家使用得最频繁的是adOpenStatic方式,当然这种方式的缺点是不能够就、实时反应出数据库中内容改变时的状况。如果要想看到数据库被其它用户改变的状况,可使用adOpenKeyse方式(但是它只能够反应出被编辑的改变情况,也就是说不能够反映出新增和删除记录的改变情况。)
    其实上面的内容大家一般都可以在微软的技术参考资料中找到,下面来说说在使用这些游标方式和加锁方式时要注意到的问题。1。首先要注意到的是这两种方式在混合使用时的问题,就是说你同时设置游标方式和加锁方式。除非你是在使用Access数据库,一般而言当你混合使用时是并不能够得到你预期想要的游标方式和加锁方式的。例如,如果你同时将游标设置为adOpenStatic方式,而将加锁设置为adLockOptimistic,你将得不到adOpenStatic方式的游标,你这时使用的游标方式将是adOpenKeyset,也就是说你使用ADO的话,它将返回adOpenKeyset的游标。2。其次,游标和加锁的混合使用还会导致ADO返回的不是你想要的加锁方式,ADO会改变你的加锁方式。例如,在默认状态下游标方式是adOpenForwardOnly,在使用这种游标方式的同时如果你使用的加锁方式为-1(就是让数据源来判断加锁方式)或则adLockReadOnly,那么这种混合方式基本上不支持RecordSet的任何方法,也就是说RecordSet的任何方法将返回False(你的recordcount,absoultpage,addnew,delete,update等都会返回-1,-1就是表示不支持该属性),但是这时如果你使用的是adOpenForwardOnly游标方式和其它的加锁方式混合,它反而会支持填加,删除和更新。
      

  3.   

    SQL Server 中的锁定介绍
    Microsoft&reg; SQL Server&#8482; 2000 具有多粒度锁定,允许一个事务锁定不同类型的资源。为了使锁定的成本减至最少,SQL Server 自动将资源锁定在适合任务的级别。锁定在较小的粒度(例如行)可以增加并发但需要较大的开销,因为如果锁定了许多行,则需要控制更多的锁。锁定在较大的粒度(例如表)就并发而言是相当昂贵的,因为锁定整个表限制了其它事务对表中任意部分进行访问,但要求的开销较低,因为需要维护的锁较少。SQL Server 可以锁定以下资源(按粒度增加的顺序列出)。资源 描述 
    RID 行标识符。用于单独锁定表中的一行。 
    键 索引中的行锁。用于保护可串行事务中的键范围。 
    页 8 千字节 (KB) 的数据页或索引页。 
    扩展盘区 相邻的八个数据页或索引页构成的一组。 
    表 包括所有数据和索引在内的整个表。 
    DB 数据库。 
    SQL Server 使用不同的锁模式锁定资源,这些锁模式确定了并发事务访问资源的方式。SQL Server 使用以下资源锁模式。锁模式 描述 
    共享 (S) 用于不更改或不更新数据的操作(只读操作),如 SELECT 语句。 
    更新 (U) 用于可更新的资源中。防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。 
    排它 (X) 用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。确保不会同时对同一资源进行多重更新。 
    意向 用于建立锁的层次结构。意向锁的类型为:意向共享 (IS)、意向排它 (IX) 以及与意向排它共享 (SIX)。 
    架构 在执行依赖于表架构的操作时使用。架构锁的类型为:架构修改 (Sch-M) 和架构稳定性 (Sch-S)。 
    大容量更新 (BU) 向表中大容量复制数据并指定了 TABLOCK 提示时使用。 
    共享锁
    共享 (S) 锁允许并发事务读取 (SELECT) 一个资源。资源上存在共享 (S) 锁时,任何其它事务都不能修改数据。一旦已经读取数据,便立即释放资源上的共享 (S) 锁,除非将事务隔离级别设置为可重复读或更高级别,或者在事务生存周期内用锁定提示保留共享 (S) 锁。更新锁
    更新 (U) 锁可以防止通常形式的死锁。一般更新模式由一个事务组成,此事务读取记录,获取资源(页或行)的共享 (S) 锁,然后修改行,此操作要求锁转换为排它 (X) 锁。如果两个事务获得了资源上的共享模式锁,然后试图同时更新数据,则一个事务尝试将锁转换为排它 (X) 锁。共享模式到排它锁的转换必须等待一段时间,因为一个事务的排它锁与其它事务的共享模式锁不兼容;发生锁等待。第二个事务试图获取排它 (X) 锁以进行更新。由于两个事务都要转换为排它 (X) 锁,并且每个事务都等待另一个事务释放共享模式锁,因此发生死锁。若要避免这种潜在的死锁问题,请使用更新 (U) 锁。一次只有一个事务可以获得资源的更新 (U) 锁。如果事务修改资源,则更新 (U) 锁转换为排它 (X) 锁。否则,锁转换为共享锁。排它锁
    排它 (X) 锁可以防止并发事务对资源进行访问。其它事务不能读取或修改排它 (X) 锁锁定的数据。意向锁
    意向锁表示 SQL Server 需要在层次结构中的某些底层资源上获取共享 (S) 锁或排它 (X) 锁。例如,放置在表级的共享意向锁表示事务打算在表中的页或行上放置共享 (S) 锁。在表级设置意向锁可防止另一个事务随后在包含那一页的表上获取排它 (X) 锁。意向锁可以提高性能,因为 SQL Server 仅在表级检查意向锁来确定事务是否可以安全地获取该表上的锁。而无须检查表中的每行或每页上的锁以确定事务是否可以锁定整个表。意向锁包括意向共享 (IS)、意向排它 (IX) 以及与意向排它共享 (SIX)。锁模式 描述 
    意向共享 (IS) 通过在各资源上放置 S 锁,表明事务的意向是读取层次结构中的部分(而不是全部)底层资源。 
    意向排它 (IX) 通过在各资源上放置 X 锁,表明事务的意向是修改层次结构中的部分(而不是全部)底层资源。IX 是 IS 的超集。 
    与意向排它共享 (SIX) 通过在各资源上放置 IX 锁,表明事务的意向是读取层次结构中的全部底层资源并修改部分(而不是全部)底层资源。允许顶层资源上的并发 IS 锁。例如,表的 SIX 锁在表上放置一个 SIX 锁(允许并发 IS 锁),在当前所修改页上放置 IX 锁(在已修改行上放置 X 锁)。虽然每个资源在一段时间内只能有一个 SIX 锁,以防止其它事务对资源进行更新,但是其它事务可以通过获取表级的 IS 锁来读取层次结构中的底层资源。 
    架构锁
    执行表的数据定义语言 (DDL) 操作(例如添加列或除去表)时使用架构修改 (Sch-M) 锁。当编译查询时,使用架构稳定性 (Sch-S) 锁。架构稳定性 (Sch-S) 锁不阻塞任何事务锁,包括排它 (X) 锁。因此在编译查询时,其它事务(包括在表上有排它 (X) 锁的事务)都能继续运行。但不能在表上执行 DDL 操作。大容量更新锁
    当将数据大容量复制到表,且指定了 TABLOCK 提示或者使用 sp_tableoption 设置了 table lock on bulk 表选项时,将使用大容量更新 (BU) 锁。大容量更新 (BU) 锁允许进程将数据并发地大容量复制到同一表,同时防止其它不进行大容量复制数据的进程访问该表。
      

  4.   

    锁定提示
    可以使用 SELECT、INSERT、UPDATE 和 DELETE 语句指定表级锁定提示的范围,以引导 Microsoft&reg; SQL Server&#8482; 2000 使用所需的锁类型。当需要对对象所获得锁类型进行更精细控制时,可以使用表级锁定提示。这些锁定提示取代了会话的当前事务隔离级别。说明  SQL Server 查询优化器自动作出正确的决定。建议仅在必要时才使用表级锁定提示更改默认的锁定行为。禁止锁定级别反过来会影响并发。
    锁定提示 描述 
    HOLDLOCK 将共享锁保留到事务完成,而不是在相应的表、行或数据页不再需要时就立即释放锁。HOLDLOCK 等同于 SERIALIZABLE。 
    NOLOCK 不要发出共享锁,并且不要提供排它锁。当此选项生效时,可能会读取未提交的事务或一组在读取中间回滚的页面。有可能发生脏读。仅应用于 SELECT 语句。 
    PAGLOCK 在通常使用单个表锁的地方采用页锁。 
    READCOMMITTED 用与运行在提交读隔离级别的事务相同的锁语义执行扫描。默认情况下,SQL Server 2000 在此隔离级别上操作。 
    READPAST 跳过锁定行。此选项导致事务跳过由其它事务锁定的行(这些行平常会显示在结果集内),而不是阻塞该事务,使其等待其它事务释放在这些行上的锁。READPAST 锁提示仅适用于运行在提交读隔离级别的事务,并且只在行级锁之后读取。仅适用于 SELECT 语句。 
    READUNCOMMITTED 等同于 NOLOCK。 
    REPEATABLEREAD 用与运行在可重复读隔离级别的事务相同的锁语义执行扫描。  
    ROWLOCK 使用行级锁,而不使用粒度更粗的页级锁和表级锁。 
    SERIALIZABLE 用与运行在可串行读隔离级别的事务相同的锁语义执行扫描。等同于 HOLDLOCK。 
    TABLOCK 使用表锁代替粒度更细的行级锁或页级锁。在语句结束前,SQL Server 一直持有该锁。但是,如果同时指定 HOLDLOCK,那么在事务结束之前,锁将被一直持有。 
    TABLOCKX 使用表的排它锁。该锁可以防止其它事务读取或更新表,并在语句或事务结束前一直持有。 
    UPDLOCK 读取表时使用更新锁,而不使用共享锁,并将锁一直保留到语句或事务的结束。UPDLOCK 的优点是允许您读取数据(不阻塞其它事务)并在以后更新数据,同时确保自从上次读取数据后数据没有被更改。 
    XLOCK 使用排它锁并一直保持到由语句处理的所有数据上的事务结束时。可以使用 PAGLOCK 或 TABLOCK 指定该锁,这种情况下排它锁适用于适当级别的粒度。 
    例如,如果将事务隔离级别设置为 SERIALIZABLE,并且在 SELECT 语句中使用表级锁定提示 NOLOCK,则键范围锁通常用于维护不采用可串行事务。USE pubs
    GO
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
    GO
    BEGIN TRANSACTION
    SELECT au_lname FROM authors WITH (NOLOCK)
    GO生成的锁是:EXEC sp_lock
    GOspid dbid ObjId IndId Type Resource Mode Status 
    1 1 0 0 DB  S GRANT 
    6 1 0 0 DB  S GRANT 
    7 1 0 0 DB  S GRANT 
    8 4 0 0 DB  S GRANT 
    8 4 0 0 DB  S GRANT 
    8 4 117575457 0 TAB  Sch-S GRANT 
    9 4 0 0 DB  S GRANT 
    9 1 21575115 0 TAB  IS GRANT 
    SELECT object_name(117575457)
    GO
    -----------------------------
    authors引用 authors 唯一采用的锁是架构稳定性 (Sch-S) 锁。在这种情况下不能保证可串行性。
      

  5.   

    谢谢各位!
    还过我还是想找一些能够下载的专门书籍来看看好些.
    以上信息各位说的都很不错,可对于我来说可能是太深了些.错不能有更详细的书?
    还有:
        1.我在用VB打开记录集时为该记录集指定一个销,如 adreadonly ,这样.我在还没有关闭该记录集之前,别的程序同样可以对表中的数据时行修改.那么我加销又有什么用呢?
        2.我在打开记录集时加的销是销我自已而已,而对别人是没有作用的,就像上面所说的一样加只读锁,这样我就不能修改了.可别人还能改.我希望的功能是:"我加只读锁,是只想写别人以只读的方式来操作我加销的记录"
        3."加'锁'是限定别的用户对被锁的记录访问的方式中"  别的用户指的是什么?,是不同的数据库连接,还是新打开的应用程序.还是新连接数据库中的 UID=UserName中的UserName 还是其它?
      

  6.   

    去看看 《 ADO  轻松编程》 机械出版社的。 
    很不错的书。