不加事务并不代表不下锁.  锁是sql的自动行为(当然, 也可以人为什么一些控制)
^^^^^^^^^^^^^^^^^^^^^^update 也会先检索数据下共享锁, 然后再下意向更新锁, 避免别人更新数据, 最后把意向更新锁变为X锁更新数据假设 update A 是正向扫描, 扫描是从头到尾
假设 update B 是反向扫描, 扫描是从尾到头
则 update B 要完成更新数据, 必须等待 update A 持有锁的释放
   update A 要完成更新数据, 也是同样道理由于 update A/B 都会等待对方完成, 所以就死锁了.

解决方案 »

  1.   

    To zjcxc(邹建)非常感谢。就是因为在开发系统中遇到上面的问题,昨天还特意跑到新华书店想买一本您写的书,但是可惜的是没有买的(可能是因为城市太小了)。打算到另外一个地方去买。另外,我看有资料介绍说,更新语句(Update)先加的是更新锁,然后在升级为X锁。怎么您又说先下共享锁??
      

  2.   

    这是联机帮助上的原话更新锁
    更新 (U) 锁可以防止通常形式的死锁。
    一般更新模式由一个事务组成,此事务读取记录,获取资源(页或行)的共享 (S) 锁
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    然后修改行,此操作要求锁转换为排它 (X) 锁。如果两个事务获得了资源上的共享模式锁,然后试图同时更新数据,则一个事务尝试将锁转换为排它 (X) 锁。共享模式到排它锁的转换必须等待一段时间,因为一个事务的排它锁与其它事务的共享模式锁不兼容;发生锁等待。第二个事务试图获取排它 (X) 锁以进行更新。由于两个事务都要转换为排它 (X) 锁,并且每个事务都等待另一个事务释放共享模式锁,因此发生死锁。若要避免这种潜在的死锁问题,请使用更新 (U) 锁。一次只有一个事务可以获得资源的更新 (U) 锁。如果事务修改资源,则更新 (U) 锁转换为排它 (X) 锁。否则,锁转换为共享锁。