1.共享锁:数据库在执行查询操作时会向table添加共享锁,不同的共享锁之间是兼容的,这意味着共享锁不阻止其它session同时读资源。
2.互斥锁:数据库在执行update操作前会试图向当前表添加互斥锁,而根据数据库的规定,同一资源上不可以同时存在共享锁和互斥锁,所以,update操作需要等到施加共享锁的操作结束后才能执行。共享锁不阻止其它session同时读资源,但阻止其它session update。
例:————————————————————
T1: select * from table
T2: select * from table
T3: update table set column1='hello'
——————————————————————
T1和T2可以同时运行,而T3需要等到T1和T2都运行完才能运行。
3.死锁的发生:
例:————————————————————
T1:
begin tran
select * from table (holdlock) (holdlock意思是加共享锁,直到事物结束才释放)
update table set column1='hello'
T2:
begin tran
select * from table(holdlock)
update table set column1='world'
——————————————————————————
假设T1和T2同时达到select,T1对table加共享锁,T2也对加共享锁,当
T1的select执行完,准备执行update时,根据锁机制,T1的共享锁需要升
级到排他锁才能执行接下来的update.在升级排他锁前,必须等table上的
其它共享锁释放,但因为holdlock这样的共享锁只有等事务结束后才释放,
所以因为T2的共享锁不释放而导致T1等(等T2释放共享锁,自己好升级成排
他锁),同理,也因为T1的共享锁不释放而导致T2等。死锁产生了。
4.预防死锁发生:
1) 将共享锁换成互斥锁
2) 将共享锁换成更新锁(效率高)