对于加锁是相对事务而言的,也就是说数据库锁需要在事务环境当中执行,否则虽然通常的数据库系统支持锁定,但是它的时间是非常短暂的,仅仅只在数据资料在数据库系统内部操作时。不过前提是你的数据库系统支持事务支持锁定。锁定之后,会有两种解锁方式,一种是你的操作完成后马上解锁(此种使用不多,特别是对于更新锁不使用此类锁定),另一种则是当操作发生时即锁定,一直到事务提交或者回滚。 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 --提交事务
在上面的语句招行过程当中,你可以使用查询分析器等工具,另外再连接上MyDatabase select * from mytablename 看看结果,再执行 select * from mytablename with(nolock) 再看看结果
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 --提交事务
select * from mytablename
看看结果,再执行
select * from mytablename with(nolock)
再看看结果
如果用 adLockPessimistic 参数打开记录集,则剪辑时便锁定记录,直至 Update 完成。
如果用 adLockOptimistic,仅当调用 Update 方法时锁定记录。加锁和解锁都是自动的,不需要程序干预。
如果用 adLockPessimistic 参数打开记录集,则剪辑时便锁定记录,直至 Update 完成。
如果用 adLockOptimistic,仅当调用 Update 方法时锁定记录。加锁和解锁都是自动的,不需要程序干预。
------------------------
加锁本身就是基于事务的,只是事务分为隐式事务和显式事务两种,并不一定需要使用Begin Transaction才表示启动了事务。adLockPessimistic和adLockOptimistic仅只是在ADO打开记录集时的一个参数,adLockPessimistic表示悲观锁定,adLockOptimistic表示乐观锁定
并且此锁定只体现调用控件的相关方法时,如果你的所有应用程序直接连接数据库,当然此类相对是比较简单的,但是也并不意味着其不参与事务,仅仅只是没有人为的参与,而集成到控件(组件)的内部处理当中去。对于离线数据编辑,则此类不适用。所谓的离线,即可以在服务器上面启动一个数据服务组件,然后将其信息保存下来,然后以与连接状态无关的方式去编辑。并且能够实现大范围的锁定,而以ADO控件去控制,则其锁定范围级别是自动的。通常使用的是行集锁定,编辑一条记录,锁定一条,如果就不能达到相关的多条记录同时锁定,或者说,更容易引起作业上面的麻烦。要现实大面积的锁定,则需要的直接显示下锁,如paglock,tablock等。
VB 中常用的 Jet 引擎使用的是内部锁。对于 .mdb 数据库,它利用一个 .ldb 文件(你打开一个数据库时可以看到它被创建)来管理这些锁。MSDN 的“Understanding Microsoft Jet Locking”有详尽的讨论。你不使用事务,它的一系列的锁也要工作的(共有 7 类)。当然,如果你在循环中多次更新数据或索引,事务可以使锁一直保持。但事务带来的缺点是,当没有提交或回滚事务就退出时(由于 BUG 或运行错误),数据库就被挂起。只有重新压缩(修复)才能访问。正确地说,锁的持续期是基于事务(transaction)的,但不必是显式地 BEGIN TRANSACTION、commit transaction。隐式的事务对于用户是透明的。在我看来,此事务非彼事务。我们 Coder 常说的事务,就是代码处理的,数据库引擎干什么,我是不管的。对于楼主来说,不要理会什么事务,设置锁类型足矣。过多的底层讨论,只能越说越糊涂。
当我加载一个FORM窗口的时候就将一个表锁定只有这个当前窗口中的SQL语句可以执行,网络上其他计算机不能对那个锁定的表进行修改和删除项,当UNLODE ME 那个FORM之后网络上的计算机才能对其进行删除和修改.
因为 Access 库并不支持表级锁,而 SQL Server 等是支持的。
VB 中常用的 Jet 引擎使用的是内部锁。对于 .mdb 数据库,它利用一个 .ldb 文件(你打开一个数据库时可以看到它被创建)来管理这些锁。MSDN 的“Understanding Microsoft Jet Locking”有详尽的讨论。你不使用事务,它的一系列的锁也要工作的(共有 7 类)。当然,如果你在循环中多次更新数据或索引,事务可以使锁一直保持。但事务带来的缺点是,当没有提交或回滚事务就退出时(由于 BUG 或运行错误),数据库就被挂起。只有重新压缩(修复)才能访问。
--------------------------------
我不知道你是如何理解事務的概念的
如果回復一個人的問題說是Access僅產生一個.ldb文件,而不使用事務,似乎有點可笑吧?
事務本身就是為了保證數據的一致性而提出的解決方案,又如何害怕異常?難道不使用事務就沒有異常?
建議樓主,首先明確你所使用的數據庫系統是什麼,然後明確你所使用的數據庫連接方式,比發ADO/OLE DB/RDO等.當然最好明確你所說的表鎖定所需要達到的目的,因為表鎖定雖然系統資源的耗用相對要小很多,但是代價卻是所有用戶將無法對該表進行數據的編輯(新增,修改,刪除)作業,這對於網絡系統來說,是最不願意看到的,同時也從某种意義上失去了多層式架構的意義,除非必要.