none
使用 update 语句碰到一个奇怪的问题 RRS feed

  • 问题

  • 使用 update glassbk set bkno='T' where ltrim(code) = '020882' 提示 锁超时
    而使用 update glassbk set bkno='T' where code = '020882' 却完全没问题

    这个数据库只有三个人连,没有使用锁机制,而且是把数据库服务停了之后再开也是这样
    2009年7月20日 5:35

答案

  • 使用 update glassbk set bkno='T' where ltrim(code) = '020882' 提示 锁超时
    而使用 update glassbk set bkno='T' where code = '020882' 却完全没问题

    这个数据库只有三个人连,没有使用锁机制,而且是把数据库服务停了之后再开也是这样

    有别的session阻塞了你的update,导致超时。
    你可以使用sys.dm_tran_locks查看具体的信息。

    ltrim(code) = '020882' 和code = '020882' 的区别是,前者可能无法使用索引(如果code列上建立了索引),导致一个全表的扫描,这样被阻塞的可能行就会增大
    你可以对比一下两者的查询计划

    另外,sqlserver会自动的添加或者释放锁,所以不存在“没有使用锁机制”的情况 可以看看inside sql server:storage engine的lock and concurrency,会有帮助
    SQL SERVER Engine Test
    2009年7月20日 9:50
    版主
  • 不好意思 ,那个视图是2005里的 2000里执行看一下 select *from master..sysprocesses where blocked<>0
    SQL SERVER Engine Test
    • 已标记为答案 scate233 2009年7月21日 4:13
    2009年7月20日 10:19
    版主

全部回复

  • 看看是否使用了 TransactionScope, 另外对字符操作比较耗时间的。你可以在保存之前就把空格去掉

    知识改变命运,奋斗成就人生!
    2009年7月20日 7:49
  • 突然间又正常了,没有用TransactionScope

    2009年7月20日 9:28
  • 使用 update glassbk set bkno='T' where ltrim(code) = '020882' 提示 锁超时
    而使用 update glassbk set bkno='T' where code = '020882' 却完全没问题

    这个数据库只有三个人连,没有使用锁机制,而且是把数据库服务停了之后再开也是这样

    有别的session阻塞了你的update,导致超时。
    你可以使用sys.dm_tran_locks查看具体的信息。

    ltrim(code) = '020882' 和code = '020882' 的区别是,前者可能无法使用索引(如果code列上建立了索引),导致一个全表的扫描,这样被阻塞的可能行就会增大
    你可以对比一下两者的查询计划

    另外,sqlserver会自动的添加或者释放锁,所以不存在“没有使用锁机制”的情况 可以看看inside sql server:storage engine的lock and concurrency,会有帮助
    SQL SERVER Engine Test
    2009年7月20日 9:50
    版主
  • sys.dm_tran_locks 这个怎么用?我是sql2000,在联机丛书里没找到这个东西
    2009年7月20日 10:09
  • 不好意思 ,那个视图是2005里的 2000里执行看一下 select *from master..sysprocesses where blocked<>0
    SQL SERVER Engine Test
    • 已标记为答案 scate233 2009年7月21日 4:13
    2009年7月20日 10:19
    版主