zwjwelch 发表于 2010-05-24 19:25

多个进程同时更新一张表,导致一个进程阻塞(进程已经无问题,此问题已解决)

本帖最后由 zwjwelch 于 2010-05-28 16:45 编辑

问题: 两个进程同时update一张表,更新到第7条左右的数据时,其中一个进程阻塞了,另一个仍在跑,两个进程操作的是完全不同的数据,sp_who看数据库状态此表lock
求教解决办法谢谢
如果此方法不行,想提高更新数据库的速度还有什么方法?谢谢

chuxu 发表于 2010-05-25 08:29

1、sp_help tablename 看一下相关表锁的粒度。 Lock scheme 是否Datarows,否则修改为DataRows.
2、update 操作的where子句尽可能使用索引,保证行锁。
3、尽快是否锁,小数据量提交,或者 set chained off.

D_D_D_D 发表于 2010-05-25 13:19

被阻塞进程是因为另一个进程的原因才进入锁等待的么?看楼主的意思是整个表锁了,看看HWM和LWM以及PCT,修改参数使页锁或行锁不升级为表锁,修改方法可以看参考手册。

zwjwelch 发表于 2010-05-25 16:01

本帖最后由 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
能更新的条数多了,但是过一会还是阻塞了

chuxu 发表于 2010-05-25 16:17

阻塞的时候把sp_lock贴一下

zwjwelch 发表于 2010-05-25 16:45

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

zwjwelch 发表于 2010-05-25 16:47

经过讨论,我的这个程序是从表中用游标取数据,但是声明游标的时候没加NOHOLDLOCK
导致fetch和另一个进程的update冲突,导致进程阻塞,同事说是这个原因,加上NOHOLDLOCK后就可以同时更新了
非常感谢各位

zwjwelch 发表于 2010-05-25 16:48

现在有个问题sybase       fetch一条记录不是只锁一条记录吗?

chuxu 发表于 2010-05-26 08:43

如果不使用NOHOLDLOCK的话,不到提交或者回滚的位置不会释放锁

zwjwelch 发表于 2010-05-26 16:54

谢谢各位:em03:
页: [1] 2
查看完整版本: 多个进程同时更新一张表,导致一个进程阻塞(进程已经无问题,此问题已解决)