不加事务并不代表不下锁. 锁是sql的自动行为(当然, 也可以人为什么一些控制)
^^^^^^^^^^^^^^^^^^^^^^update 也会先检索数据下共享锁, 然后再下意向更新锁, 避免别人更新数据, 最后把意向更新锁变为X锁更新数据假设 update A 是正向扫描, 扫描是从头到尾
假设 update B 是反向扫描, 扫描是从尾到头
则 update B 要完成更新数据, 必须等待 update A 持有锁的释放
update A 要完成更新数据, 也是同样道理由于 update A/B 都会等待对方完成, 所以就死锁了.
^^^^^^^^^^^^^^^^^^^^^^update 也会先检索数据下共享锁, 然后再下意向更新锁, 避免别人更新数据, 最后把意向更新锁变为X锁更新数据假设 update A 是正向扫描, 扫描是从头到尾
假设 update B 是反向扫描, 扫描是从尾到头
则 update B 要完成更新数据, 必须等待 update A 持有锁的释放
update A 要完成更新数据, 也是同样道理由于 update A/B 都会等待对方完成, 所以就死锁了.
更新 (U) 锁可以防止通常形式的死锁。
一般更新模式由一个事务组成,此事务读取记录,获取资源(页或行)的共享 (S) 锁
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
然后修改行,此操作要求锁转换为排它 (X) 锁。如果两个事务获得了资源上的共享模式锁,然后试图同时更新数据,则一个事务尝试将锁转换为排它 (X) 锁。共享模式到排它锁的转换必须等待一段时间,因为一个事务的排它锁与其它事务的共享模式锁不兼容;发生锁等待。第二个事务试图获取排它 (X) 锁以进行更新。由于两个事务都要转换为排它 (X) 锁,并且每个事务都等待另一个事务释放共享模式锁,因此发生死锁。若要避免这种潜在的死锁问题,请使用更新 (U) 锁。一次只有一个事务可以获得资源的更新 (U) 锁。如果事务修改资源,则更新 (U) 锁转换为排它 (X) 锁。否则,锁转换为共享锁。