我做了个系统打算能进行网络连接.但是在进行网络连接之后如果一台计算机对数据进行修改的话其他网络上的计算机将不能对数据进行修改,我想在一台计算机对一个表或多个表操作的时候对其进行加锁,使得其他计算机不能使用那个被加锁的表.请问那个排它缩怎么加和解除呀.
哪位高手能不能举一个例子出来呀??

解决方案 »

  1.   

    对于加锁是相对事务而言的,也就是说数据库锁需要在事务环境当中执行,否则虽然通常的数据库系统支持锁定,但是它的时间是非常短暂的,仅仅只在数据资料在数据库系统内部操作时。不过前提是你的数据库系统支持事务支持锁定。锁定之后,会有两种解锁方式,一种是你的操作完成后马上解锁(此种使用不多,特别是对于更新锁不使用此类锁定),另一种则是当操作发生时即锁定,一直到事务提交或者回滚。
    use MyDatabase
    go
    SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;--设置事务等级
    GO
    BEGIN TRANSACTION;--启动事务
    go
    select * from mytablename with (XLOCK,HOLDLOCK )--加X锁,全程锁定
    go
    waitfor DELAY  '00:05:00' --由于是测试,所以这里面让它延续5分钟
    go
    commit transaction --提交事务
      

  2.   

    在上面的语句招行过程当中,你可以使用查询分析器等工具,另外再连接上MyDatabase
    select * from mytablename
    看看结果,再执行
    select * from mytablename with(nolock)
    再看看结果
      

  3.   

    加锁与事务没有关系。数据库驱动程序(引擎)本身支持加锁。但是,数据库缺省的锁是在记录上。
    如果用 adLockPessimistic 参数打开记录集,则剪辑时便锁定记录,直至 Update 完成。
    如果用 adLockOptimistic,仅当调用 Update 方法时锁定记录。加锁和解锁都是自动的,不需要程序干预。
      

  4.   

    加锁与事务没有关系。数据库驱动程序(引擎)本身支持加锁。但是,数据库缺省的锁是在记录上。
    如果用 adLockPessimistic 参数打开记录集,则剪辑时便锁定记录,直至 Update 完成。
    如果用 adLockOptimistic,仅当调用 Update 方法时锁定记录。加锁和解锁都是自动的,不需要程序干预。
    ------------------------
    加锁本身就是基于事务的,只是事务分为隐式事务和显式事务两种,并不一定需要使用Begin Transaction才表示启动了事务。adLockPessimistic和adLockOptimistic仅只是在ADO打开记录集时的一个参数,adLockPessimistic表示悲观锁定,adLockOptimistic表示乐观锁定
    并且此锁定只体现调用控件的相关方法时,如果你的所有应用程序直接连接数据库,当然此类相对是比较简单的,但是也并不意味着其不参与事务,仅仅只是没有人为的参与,而集成到控件(组件)的内部处理当中去。对于离线数据编辑,则此类不适用。所谓的离线,即可以在服务器上面启动一个数据服务组件,然后将其信息保存下来,然后以与连接状态无关的方式去编辑。并且能够实现大范围的锁定,而以ADO控件去控制,则其锁定范围级别是自动的。通常使用的是行集锁定,编辑一条记录,锁定一条,如果就不能达到相关的多条记录同时锁定,或者说,更容易引起作业上面的麻烦。要现实大面积的锁定,则需要的直接显示下锁,如paglock,tablock等。
      

  5.   

    哥哥真够僵的。
    VB 中常用的 Jet 引擎使用的是内部锁。对于 .mdb 数据库,它利用一个 .ldb 文件(你打开一个数据库时可以看到它被创建)来管理这些锁。MSDN 的“Understanding Microsoft Jet Locking”有详尽的讨论。你不使用事务,它的一系列的锁也要工作的(共有 7 类)。当然,如果你在循环中多次更新数据或索引,事务可以使锁一直保持。但事务带来的缺点是,当没有提交或回滚事务就退出时(由于 BUG 或运行错误),数据库就被挂起。只有重新压缩(修复)才能访问。正确地说,锁的持续期是基于事务(transaction)的,但不必是显式地 BEGIN TRANSACTION、commit transaction。隐式的事务对于用户是透明的。在我看来,此事务非彼事务。我们 Coder 常说的事务,就是代码处理的,数据库引擎干什么,我是不管的。对于楼主来说,不要理会什么事务,设置锁类型足矣。过多的底层讨论,只能越说越糊涂。
      

  6.   

    我的基本问题是,我有些数据管理窗口.
    当我加载一个FORM窗口的时候就将一个表锁定只有这个当前窗口中的SQL语句可以执行,网络上其他计算机不能对那个锁定的表进行修改和删除项,当UNLODE ME 那个FORM之后网络上的计算机才能对其进行删除和修改.
      

  7.   

    你还没有告诉我们你用的是什么数据库。
    因为 Access 库并不支持表级锁,而 SQL Server 等是支持的。
      

  8.   

    哥哥真够僵的。
    VB 中常用的 Jet 引擎使用的是内部锁。对于 .mdb 数据库,它利用一个 .ldb 文件(你打开一个数据库时可以看到它被创建)来管理这些锁。MSDN 的“Understanding Microsoft Jet Locking”有详尽的讨论。你不使用事务,它的一系列的锁也要工作的(共有 7 类)。当然,如果你在循环中多次更新数据或索引,事务可以使锁一直保持。但事务带来的缺点是,当没有提交或回滚事务就退出时(由于 BUG 或运行错误),数据库就被挂起。只有重新压缩(修复)才能访问。
    --------------------------------
    我不知道你是如何理解事務的概念的
    如果回復一個人的問題說是Access僅產生一個.ldb文件,而不使用事務,似乎有點可笑吧?
    事務本身就是為了保證數據的一致性而提出的解決方案,又如何害怕異常?難道不使用事務就沒有異常?
    建議樓主,首先明確你所使用的數據庫系統是什麼,然後明確你所使用的數據庫連接方式,比發ADO/OLE DB/RDO等.當然最好明確你所說的表鎖定所需要達到的目的,因為表鎖定雖然系統資源的耗用相對要小很多,但是代價卻是所有用戶將無法對該表進行數據的編輯(新增,修改,刪除)作業,這對於網絡系統來說,是最不願意看到的,同時也從某种意義上失去了多層式架構的意義,除非必要.