多个进程同时更新一张表,导致一个进程阻塞(进程已经无问题,此问题已解决)
本帖最后由 zwjwelch 于 2010-05-28 16:45 编辑问题: 两个进程同时update一张表,更新到第7条左右的数据时,其中一个进程阻塞了,另一个仍在跑,两个进程操作的是完全不同的数据,sp_who看数据库状态此表lock
求教解决办法谢谢
如果此方法不行,想提高更新数据库的速度还有什么方法?谢谢 1、sp_help tablename 看一下相关表锁的粒度。 Lock scheme 是否Datarows,否则修改为DataRows.
2、update 操作的where子句尽可能使用索引,保证行锁。
3、尽快是否锁,小数据量提交,或者 set chained off. 被阻塞进程是因为另一个进程的原因才进入锁等待的么?看楼主的意思是整个表锁了,看看HWM和LWM以及PCT,修改参数使页锁或行锁不升级为表锁,修改方法可以看参考手册。 本帖最后由 zwjwelch 于 2010-05-25 16:03 编辑
我按版主的说法
1.No defined keys for this object.
Object is not partitioned.
Lock scheme Datarows
2.完全按照索引,tt_inx nonclustered located on default
3.set Chain off
能更新的条数多了,但是过一会还是阻塞了 阻塞的时候把sp_lock贴一下 Range
0 73 146 Sh_row 1050483790 2091810
7 msedb Cursor Id 4784129
Range
0 73 146 Sh_row 1050483790 2091810
8 msedb Cursor Id 4784129
Range
0 73 146 Sh_row 1050483790 2091810
9 msedb Cursor Id 4784129
Range
0 73 146 Sh_row 1050483790 2091810
10 msedb Cursor Id 4784129
Range
0 73 146 Sh_row 1050483790 2091810
11 msedb Cursor Id 4784129
Range
0 73 146 Sh_row 1050483790 2091810
12 msedb Cursor Id 4784129
Range
0 73 146 Sh_row 1050483790 2091810
13 msedb Cursor Id 4784129
Range
0 73 146 Sh_row 1050483790 2091810
14 msedb Cursor Id 4784129
Range
0 73 146 Sh_row 1050483790 2091810
15 msedb Cursor Id 4784129
Range 经过讨论,我的这个程序是从表中用游标取数据,但是声明游标的时候没加NOHOLDLOCK
导致fetch和另一个进程的update冲突,导致进程阻塞,同事说是这个原因,加上NOHOLDLOCK后就可以同时更新了
非常感谢各位 现在有个问题sybase fetch一条记录不是只锁一条记录吗? 如果不使用NOHOLDLOCK的话,不到提交或者回滚的位置不会释放锁 谢谢各位:em03:
页:
[1]
2