对记录加锁的问题,小弟愚昧再问一次(100分)

  • 主题发起人 主题发起人 terry_lzs
  • 开始时间 开始时间
T

terry_lzs

Unregistered / Unconfirmed
GUEST, unregistred user!
我希望做到对于某条记录来说第一个用户可以进行读和修改,而同时如果有另一个用户
访问到这天记录时就只能进行读操作了,并且提示记录正在被使用。
我自己做了试验
adoquery1.Close;
adoquery1.LockType:=ltpessimistic;
adoquery1.Open;
adoquery1.Edit;
adoquery1.FieldByName('aa').asstring:='ll';
同时打开两个实例执行,好像并没有到达要求。我不知道怎么办了,以前的那些也没看懂
请各位大侠指教,谢谢了。
 
可以在记录内容上做文章吧!
:)
 
To terry_lzs 大虾:
这样的设计思路仍然是单机数据库的路线,我们设计 C/S 系统,目的就是为了提高多事务
并发功能,体现网络和 C/S 体系结构的优势,而且各种大型数据库系统也做了极大的努力用
于提高事务的并发性,象你提出的问题其实是往死胡同里走。
客户端同服务器最好通过标准 SQL DML 语句通讯,并且启用显示事务提交,这样才是最好
的解决办法。
 
to bakubaku:
我知道现在多数的数据库都能保证同时写入时不冲突,可是如果一个人在改字段a
一个人在改字段b,同时存时只会有一个人的记录留下,为了避免这种情况也只好
一个人在编辑时另一个人只能浏览这条记录而不能也编辑了。
 
那你就自己改表结构。增加一个状态字段。如果不愿意这样,
再建一个表,把需要锁定的各个表的记录状态,ID,锁定时间。。。保存。
修改时首先检查这个表就行了。phplib用了这个方法。还有,要考虑timeout问题。
即每人只能锁定一定时间(比如10分钟)。
否则。一个人锁定表的一条记录后windows 崩溃了或者回家吃饭去了:-),别人就
不用干活了。
 
我在《delphi5从入门到精通》上看到例子,说是可以实现,可是我试了好像没有反应,sigh
procedure TadoForm.cblockclick(sender:Tobject);
begin
adotable.close;
if not cblock.checked then
adotable.locktype:=ltpessimistic
else
adotable.locktype:=ltoptimistic;
adotable.open
end;
我只不过用的是adoquery难道只能对table适用?!不可能!!!!
 
建议你参考LID=331077
 
补充一下我用的是sql7.0,拜托各位了。小弟这里谢谢大家了
 
Another_eYes有在吗?我看了你在LID=331077上发表的文章,上面提到的完全与我的
要求一样,能把你的方法具体些告诉我吗?谢谢了。
 
to 龙丹:我看了你的文章了,非常谢谢你的提示,不过我对记录的加锁是希望有一定时
间的,就像vfp中的lock加锁后直到这个用户退出程序或是发生异常,访问其他记录时才
解锁。
 
可以在表上加一个timestamp列,从而对表进行乐观锁定:
若 A、B 同时对表读取并修改 ,先提交的修改有效,后
提交的修改将被拒绝。这样还可以确保最新的数据不被
旧的数据重新覆盖。
 
我想最好用事务处理最好。
database.BeginTrans //**开始事务处理
database.CommitTrans //事务提交处理
database.RollbackTrans //取消事务处理
 
首先一点是在DELPHI中query控件和TABLE控件是有很大区别的,很多TABLE支持的QUERY不支持,
原因我个人觉得是由于QUERY的数据源是无法预先知道其复杂度的。
其次对于锁的问题,我知道一个方法是,在一个用户控制一条记录时不希望其他控制,可以
在操作前对该记录执行一条无效SQL操作而获得排他锁,使其他只可浏览记录,在自己完全操
作成功后COMMIT,释放排他锁。
 
to onedot:
排他锁?ltpressimistic?你能说具体些吗?谢谢了。
 
也可以用后台如用SQL SERVER 7 的,
QUERY。SQL。ADD(‘BEGIN TRAN’);
。。。。。。。。。
QUERY。SQL。ADD('IF @@erer <> 0 then');
query.sql.add('return')
query.sql.add('commit work') ;
TRY
。。。。。。

这种是最好的事物处理方式
 
不讨论了就请结束问题!
 
Oracle 是行级锁定,(完全满足你的要求。)
MS Sql Server, Sybase SQL Server 都是页级锁定,也就是说,他不会本身支持你的想法
变通的方法只有,自己做锁定标志(具体方法可参照上述,不要指望用SQL语句,他的锁定
是页级锁定)。
 
to shd:
如果我在adoquery中只选中一条记录进行加锁是否能达到我的要求?
 
-》:Shd
-》》MS Sql Server, Sybase SQL Server 都是页级锁定

MS Sql Server 7.0 支持行级锁定。6.5以前是页锁定。
 
to 三代坦克, True, Let me see....请问你有什么好资料吗?
to terry_lzs, 你现在不要管用什么来操作数据库,你直接写SQL,试一下锁定一条记录,
然后编辑相邻记录,如可以,那肯定可以用ADOQUERY实现。
 
后退
顶部