PB+MSSQL的问题,高手请进

newskysoft 2004-02-18 02:16:08
这个问题我相信所有人都可能遇到,对于我而言已经在两个不同软件的开发中遇到这个现象了,此现象相当奇怪。向数据库提交select语句后,在执行提交语句前sqlserver在该表上加了共享锁并一直不释放,直到commit or rollback。怀疑这可能是sqlserver的一个bug,为验证这一点我做了个实验:

1、restart sqlserver后打开sqlserver的查询分析器
2、确保当前连到sqlserver的只有一个连接
3、在不修改默认配置的情况下在查询分析器里输入
select * from t_xxx
4、打开企业管理器查看加锁情况

结果发现在select出某些行的数据时t_xxx的共享锁一直没有释放

我相信看过此贴的人肯定无法重复该实验,因为在普通情况下共享锁是肯定被释放的,但是在我这两个系统的实际使用中确实发生了此问题。sqlserver对于共享锁的解释如下:
“共享 (S) 锁允许并发事务读取 (SELECT) 一个资源。资源上存在共享 (S) 锁时,任何其它事务都不能修改数据。一旦已经读取数据,便立即释放资源上的共享 (S) 锁,除非将事务隔离级别设置为可重复读或更高级别,或者在事务生存周期内用锁定提示保留共享 (S) 锁。”
文中后两句“除非...或者...”无非是指更改sqlca.lock提升事务隔离级别或在select时使用with( XLOCK)等语句强制加锁.但是在我的实验里不可能存在这两种情况,所以sqlserver应该“一旦已经读取数据,便立即释放资源上的共享 (S) 锁”但是实际情况是没有释放,结果可想而知,并发操作被阻塞了。

修改autocommit=true或select后commit可解决此问题,但几十M程序的修改量相当大,如果修改sqlca.lock降低隔离级别又会导致脏读,真的是不知道怎么办好。sqlserver我是按默认配置安装的,不知道如何设置能解决此问题。另外实际使用时开始并未发生加锁的情况,只是在使用几周后表的数据达到一定量后发生此问题的。

请各位帮忙分析分析,谢谢了。


...全文
106 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复

752

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧