社区
数据库相关
帖子详情
关于锁的一个问题
DeadWolf
2003-06-03 11:44:22
客户端程序只在一台机器上会出现锁数据库的问题,而在其他的机器上从来就没发生过。
程序中没有显示编写有关数据库加锁的代码。
数据库系统是SQL2000
...全文
24
16
打赏
收藏
关于锁的一个问题
客户端程序只在一台机器上会出现锁数据库的问题,而在其他的机器上从来就没发生过。 程序中没有显示编写有关数据库加锁的代码。 数据库系统是SQL2000
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
16 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
「已注销」
2003-06-03
打赏
举报
回复
数据库锁的问题,比较常见,但象 gardenyang(太阳雨)说的因为机器慢导致的锁定很少见,在SQLServer2000中出现的几率很小,因为所谓的抢占资源,其实DBMS现在已经可以很好的处理。
但有几点需要注意,如果你自己进行事务锁,则一定要记着及时对锁进行释放。如要从表中的一个字段进行取最大值加一做为下行主键的问题,你要启动自己的事务,在这各事务中进行最大值的锁定操作,取出最大值后马上进行提交。在这个事务中建议你不要有提示信息等功能,设想以下如果用户离开的话,消息框一直没有关闭,就会导致表的一直锁定。
另外这中情况的锁类型应该为(TabLockX),而holdLock按意思也是一直锁定直到事物结束单经测试有时会过早的释放。
最后就是对锁定的处理:
通过企业管理器的管理下的活动可以查看当前的活动用户和锁,你可以查看属性是因为什么数据库要锁定记录,特别是那种死锁一定要处理,对表锁也要特别注意,而页锁的处理要看数据的访问率,不过一般情况下,DBMS可以很好的处理。
写了这麽多,如果有其他的,请大家会帖
gardenyang
2003-06-03
打赏
举报
回复
数据库加锁是自动的,可能你这台机器速度很慢吧
「已注销」
2003-06-03
打赏
举报
回复
数据库的隔离级别取决于DBMS,很多你在Delphi中设置的是无效的
DeadWolf
2003-06-03
打赏
举报
回复
TDatabase.TransIsolation的属性设置的是
tiReadCommitted
DeadWolf
2003-06-03
打赏
举报
回复
不是我不愿意把代码贴出来
只是一些Edit,Post,Insert,Open之类的操作
罗列出来可能大家看的头痛
因为只有那一台机器会发生这种情况,所以还没确定到底那个过程的代码引起的!
另外请问 tomyang(tomyang)怎样设置数据库的隔离等级
tomyang
2003-06-03
打赏
举报
回复
请详细描述问题。比如作什么操作的时候会发生锁,锁是的类型是什么等等
你的问题好像是:我写的程序没有对数据库的显示加锁操作,但是在一台特定的机器执行会出现数据库会被锁定,为什么?
这样的问题怎么回答?
另外提供一些常识:
数据库是否加锁与数据库设置的隔离等级相关,如果隔离等级设的高,则哪怕是select也会加锁。因此排除数据库锁的问题应当首先 检查锁的类型,检查造成锁的程序代码,检查数据库的设置,别着急,找到问题后,一切就简单了
tomyang
2003-06-03
打赏
举报
回复
当然是和操作数据库的代码相关
星之瀚海
2003-06-03
打赏
举报
回复
没见过
DeadWolf
2003-06-03
打赏
举报
回复
那我先试试看
belllab
2003-06-03
打赏
举报
回复
但你这种情况我的确碰到过,我就是这样解决的
belllab
2003-06-03
打赏
举报
回复
注意BDE用的是客户端游标->可能说错了,呵呵,请见谅!
belllab
2003-06-03
打赏
举报
回复
注意BDE用的是客户端游标,当数据量大时,它不会一下子将数据全部从服务器上取回来,因此服务器上将会占用资源。请在你的QUERY。OPEN后加上LAST;FIRST将数据全部取回来。(我曾经碰到过,它会造成阻塞,而且不是死锁,很麻痹人的)
DeadWolf
2003-06-03
打赏
举报
回复
BDE
目前数据量还不大
表里面就上千条吧
企业管理器查看到的SQL也不完整,就是SELECT 字段列表[由二十多个字段]
可能是从我程序中的SELECT * FROM 表名得到的
belllab
2003-06-03
打赏
举报
回复
把SQL语句写全,还有,你用的是ADO还是BDE,这条SQL语句的数据量有多大?
fhuibo
2003-06-03
打赏
举报
回复
楼主好恐怖
俺还是小心的为好!
DeadWolf
2003-06-03
打赏
举报
回复
通过企业管理器查看
锁定的进程的上一条TSQL是SELECT .....
简单SELECT为什么会锁定表
面试必备之乐观
锁
与悲观
锁
悲观
锁
总是假设最坏的情况,认为共享资源每次被访问的时候就会出现
问题
(比如共享数据被修改),所以每次在获取资源操作的时候都会上
锁
,这样其他线程想拿到这个资源就会阻塞直到
锁
被上
一个
持有者释放。也就是说,共享资源每次只给
一个
线程使用,其它线程阻塞,用完后再把资源转让给其它线程。像 Java 中和等独占
锁
就是悲观
锁
思想的实现。悲观
锁
通常多用于写多比较多的情况下(多写场景),避免频繁失败和重试影响性能。
关于Redis分布式
锁
的8个
问题
【本文转载自公众号文章,觉得文章写的很不错,放在自己空间供以后学习回顾,如涉及侵权,请联系我删除,感谢】 在分布式系统中,由于 redis 分布式
锁
相对于更简单和高效,成为了分布式
锁
的首先,被我们用到了很多实际业务场景当中。 但不是说用了 redis 分布式
锁
,就可以高枕无忧了,如果没有用好或者用对,也会引来一些意想不到的
问题
。 今天我们就一起聊聊 redis 分布式
锁
的一些坑,给有需要的朋友
一个
参考: 非原子操作 使用 redis 的分布式
锁
,我们首先想到的可能是 setNx 命
悲观
锁
和乐观
锁
的使用
1、悲观
锁
(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上
锁
,这样别人想拿这个数据就会block直到它拿到
锁
。传统的关系型数据库里边就用到了很多这种
锁
机制,比如行
锁
,表
锁
等,读
锁
,写
锁
等,都是在做操作之前先上
锁
。 最常用的就是 select .. for update,它是一种行
锁
,会把select出来的结果行
锁
住,在本
Redis分布式
锁
的超时
问题
Redis的分布式
锁
并不能解决超时
问题
,如果在加
锁
和释放
锁
之间的逻辑执行得太长,以至于超出了
锁
的超时限制,就会出现
问题
,因为这时候第
一个
线程持有的
锁
过期了,临界区的逻辑还没有执行完,而同时第二个线程就提前持有了这把
锁
,导致临界区代码不能得到严格串行执行 为了避免这个
问题
,分布式
锁
不要用于较长时间的任务,如果真的偶尔出现了
问题
,造成的数据小错乱,可能需要人工介入解决 有
一个
稍微安全一点的方案,是将set指令的value参数设置为
一个
随机数,释放
锁
时先匹配随机数是否一致,然后在删除key,这是为了确保当前线程占
一把互斥
锁
保护多个资源
一把互斥
锁
保护多个资源前言保护没有关联关系的多个资源保护有关联关系的多个资源使用
锁
的正确姿势总结 前言 在上一篇文章中,我们提到受保护资源和
锁
之间合理的关联关系应该是 N:1 的关系,也就是说可以用一把
锁
来保护多个资源,但是不能用多把
锁
来保护
一个
资源,并且结合文中示例,我们也重点强调了“不能用多把
锁
来保护
一个
资源”这个
问题
。而至于如何保护多个资源,我们今天就来聊聊。 当我们要保护多个资源时,首先要区分这些资源是否存在关联关系。 保护没有关联关系的多个资源 在现实世界里,球场的座位和电影院的座位就是没有关
数据库相关
2,497
社区成员
88,445
社区内容
发帖
与我相关
我的任务
数据库相关
Delphi 数据库相关
复制链接
扫一扫
分享
社区描述
Delphi 数据库相关
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章